docs: public final EObject ruleXSwitchExpression() throws RecognitionException {
          EObject current = null;
  
          Token otherlv_1=null;
          Token otherlv_2=null;
          Token otherlv_4=null;
          Token otherlv_6=null;
          Token otherlv_8=null;
          Token otherlv_10=null;
          Token otherlv_12=null;
          Token otherlv_13=null;
          Token otherlv_15=null;
          EObject lv_declaredParam_3_0 = null;
  
          EObject lv_switch_5_0 = null;
  
          EObject lv_declaredParam_7_0 = null;
  
          EObject lv_switch_9_0 = null;
  
          EObject lv_cases_11_0 = null;
  
          EObject lv_default_14_0 = null;
  
  
  
          	enterRule();
  
          try {
              // InternalSARL.g:8546:2: ( ( () otherlv_1= 'switch' ( ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) '=' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= '=' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' ) | ( ( ( ( ( ( ruleJvmFormalParameter ) ) '=' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= '=' ) )? ( (lv_switch_9_0= ruleXExpression ) ) ) ) otherlv_10= '{' ( (lv_cases_11_0= ruleXCasePart ) )* (otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) ) )? otherlv_15= '}' ) )
              // InternalSARL.g:8547:2: ( () otherlv_1= 'switch' ( ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) '=' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= '=' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' ) | ( ( ( ( ( ( ruleJvmFormalParameter ) ) '=' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= '=' ) )? ( (lv_switch_9_0= ruleXExpression ) ) ) ) otherlv_10= '{' ( (lv_cases_11_0= ruleXCasePart ) )* (otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) ) )? otherlv_15= '}' )
              {
              // InternalSARL.g:8547:2: ( () otherlv_1= 'switch' ( ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) '=' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= '=' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' ) | ( ( ( ( ( ( ruleJvmFormalParameter ) ) '=' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= '=' ) )? ( (lv_switch_9_0= ruleXExpression ) ) ) ) otherlv_10= '{' ( (lv_cases_11_0= ruleXCasePart ) )* (otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) ) )? otherlv_15= '}' )
              // InternalSARL.g:8548:3: () otherlv_1= 'switch' ( ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) '=' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= '=' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' ) | ( ( ( ( ( ( ruleJvmFormalParameter ) ) '=' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= '=' ) )? ( (lv_switch_9_0= ruleXExpression ) ) ) ) otherlv_10= '{' ( (lv_cases_11_0= ruleXCasePart ) )* (otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) ) )? otherlv_15= '}'
              {
              // InternalSARL.g:8548:3: ()
              // InternalSARL.g:8549:4: 
              {
              if ( state.backtracking==0 ) {
  
                				current = forceCreateModelElement(
                					grammarAccess.getXSwitchExpressionAccess().getXSwitchExpressionAction_0(),
                					current);
                			
              }
  
              }
  
              otherlv_1=(Token)match(input,68,FOLLOW_45); if (state.failed) return current;
              if ( state.backtracking==0 ) {
  
                			newLeafNode(otherlv_1, grammarAccess.getXSwitchExpressionAccess().getSwitchKeyword_1());
                		
              }
              // InternalSARL.g:8559:3: ( ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) '=' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= '=' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' ) | ( ( ( ( ( ( ruleJvmFormalParameter ) ) '=' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= '=' ) )? ( (lv_switch_9_0= ruleXExpression ) ) ) )
              int alt232=2;
              alt232 = dfa232.predict(input);
              switch (alt232) {
                  case 1 :
                      // InternalSARL.g:8560:4: ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) '=' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= '=' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' )
                      {
                      // InternalSARL.g:8560:4: ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) '=' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= '=' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' )
                      // InternalSARL.g:8561:5: ( ( ( '(' ( ( ruleJvmFormalParameter ) ) '=' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= '=' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')'
                      {
                      // InternalSARL.g:8561:5: ( ( ( '(' ( ( ruleJvmFormalParameter ) ) '=' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= '=' ) )
                      // InternalSARL.g:8562:6: ( ( '(' ( ( ruleJvmFormalParameter ) ) '=' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= '=' )
                      {
                      // InternalSARL.g:8572:6: (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= '=' )
                      // InternalSARL.g:8573:7: otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= '='
                      {
                      otherlv_2=(Token)match(input,49,FOLLOW_75); if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        							newLeafNode(otherlv_2, grammarAccess.getXSwitchExpressionAccess().getLeftParenthesisKeyword_2_0_0_0_0());
                        						
                      }
                      // InternalSARL.g:8577:7: ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) )
                      // InternalSARL.g:8578:8: (lv_declaredParam_3_0= ruleJvmFormalParameter )
                      {
                      // InternalSARL.g:8578:8: (lv_declaredParam_3_0= ruleJvmFormalParameter )
                      // InternalSARL.g:8579:9: lv_declaredParam_3_0= ruleJvmFormalParameter
                      {
                      if ( state.backtracking==0 ) {
  
                        									newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getDeclaredParamJvmFormalParameterParserRuleCall_2_0_0_0_1_0());
                        								
                      }
                      pushFollow(FOLLOW_83);
                      lv_declaredParam_3_0=ruleJvmFormalParameter();
  
                      state._fsp--;
                      if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        									if (current==null) {
                        										current = createModelElementForParent(grammarAccess.getXSwitchExpressionRule());
                        									}
                        									set(
                        										current,
                        										"declaredParam",
                        										lv_declaredParam_3_0,
                        										"io.sarl.lang.SARL.JvmFormalParameter");
                        									afterParserOrEnumRuleCall();
                        								
                      }
  
                      }
  
  
                      }
  
                      otherlv_4=(Token)match(input,47,FOLLOW_45); if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        							newLeafNode(otherlv_4, grammarAccess.getXSwitchExpressionAccess().getEqualsSignKeyword_2_0_0_0_2());
                        						
                      }
  
                      }
  
  
                      }
  
                      // InternalSARL.g:8602:5: ( (lv_switch_5_0= ruleXExpression ) )
                      // InternalSARL.g:8603:6: (lv_switch_5_0= ruleXExpression )
                      {
                      // InternalSARL.g:8603:6: (lv_switch_5_0= ruleXExpression )
                      // InternalSARL.g:8604:7: lv_switch_5_0= ruleXExpression
                      {
                      if ( state.backtracking==0 ) {
  
                        							newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getSwitchXExpressionParserRuleCall_2_0_1_0());
                        						
                      }
                      pushFollow(FOLLOW_81);
                      lv_switch_5_0=ruleXExpression();
  
                      state._fsp--;
                      if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        							if (current==null) {
                        								current = createModelElementForParent(grammarAccess.getXSwitchExpressionRule());
                        							}
                        							set(
                        								current,
                        								"switch",
                        								lv_switch_5_0,
                        								"org.eclipse.xtext.xbase.Xbase.XExpression");
                        							afterParserOrEnumRuleCall();
                        						
                      }
  
                      }
  
  
                      }
  
                      otherlv_6=(Token)match(input,50,FOLLOW_17); if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        					newLeafNode(otherlv_6, grammarAccess.getXSwitchExpressionAccess().getRightParenthesisKeyword_2_0_2());
                        				
                      }
  
                      }
  
  
                      }
                      break;
                  case 2 :
                      // InternalSARL.g:8627:4: ( ( ( ( ( ( ruleJvmFormalParameter ) ) '=' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= '=' ) )? ( (lv_switch_9_0= ruleXExpression ) ) )
                      {
                      // InternalSARL.g:8627:4: ( ( ( ( ( ( ruleJvmFormalParameter ) ) '=' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= '=' ) )? ( (lv_switch_9_0= ruleXExpression ) ) )
                      // InternalSARL.g:8628:5: ( ( ( ( ( ruleJvmFormalParameter ) ) '=' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= '=' ) )? ( (lv_switch_9_0= ruleXExpression ) )
                      {
                      // InternalSARL.g:8628:5: ( ( ( ( ( ruleJvmFormalParameter ) ) '=' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= '=' ) )?
                      int alt231=2;
                      alt231 = dfa231.predict(input);
                      switch (alt231) {
                          case 1 :
                              // InternalSARL.g:8629:6: ( ( ( ( ruleJvmFormalParameter ) ) '=' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= '=' )
                              {
                              // InternalSARL.g:8638:6: ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= '=' )
                              // InternalSARL.g:8639:7: ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= '='
                              {
                              // InternalSARL.g:8639:7: ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) )
                              // InternalSARL.g:8640:8: (lv_declaredParam_7_0= ruleJvmFormalParameter )
                              {
                              // InternalSARL.g:8640:8: (lv_declaredParam_7_0= ruleJvmFormalParameter )
                              // InternalSARL.g:8641:9: lv_declaredParam_7_0= ruleJvmFormalParameter
                              {
                              if ( state.backtracking==0 ) {
  
                                									newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getDeclaredParamJvmFormalParameterParserRuleCall_2_1_0_0_0_0());
                                								
                              }
                              pushFollow(FOLLOW_83);
                              lv_declaredParam_7_0=ruleJvmFormalParameter();
  
                              state._fsp--;
                              if (state.failed) return current;
                              if ( state.backtracking==0 ) {
  
                                									if (current==null) {
                                										current = createModelElementForParent(grammarAccess.getXSwitchExpressionRule());
                                									}
                                									set(
                                										current,
                                										"declaredParam",
                                										lv_declaredParam_7_0,
                                										"io.sarl.lang.SARL.JvmFormalParameter");
                                									afterParserOrEnumRuleCall();
                                								
                              }
  
                              }
  
  
                              }
  
                              otherlv_8=(Token)match(input,47,FOLLOW_45); if (state.failed) return current;
                              if ( state.backtracking==0 ) {
  
                                							newLeafNode(otherlv_8, grammarAccess.getXSwitchExpressionAccess().getEqualsSignKeyword_2_1_0_0_1());
                                						
                              }
  
                              }
  
  
                              }
                              break;
  
                      }
  
                      // InternalSARL.g:8664:5: ( (lv_switch_9_0= ruleXExpression ) )
                      // InternalSARL.g:8665:6: (lv_switch_9_0= ruleXExpression )
                      {
                      // InternalSARL.g:8665:6: (lv_switch_9_0= ruleXExpression )
                      // InternalSARL.g:8666:7: lv_switch_9_0= ruleXExpression
                      {
                      if ( state.backtracking==0 ) {
  
                        							newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getSwitchXExpressionParserRuleCall_2_1_1_0());
                        						
                      }
                      pushFollow(FOLLOW_17);
                      lv_switch_9_0=ruleXExpression();
  
                      state._fsp--;
                      if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        							if (current==null) {
                        								current = createModelElementForParent(grammarAccess.getXSwitchExpressionRule());
                        							}
                        							set(
                        								current,
                        								"switch",
                        								lv_switch_9_0,
                        								"org.eclipse.xtext.xbase.Xbase.XExpression");
                        							afterParserOrEnumRuleCall();
                        						
                      }
  
                      }
  
  
                      }
  
  
                      }
  
  
                      }
                      break;
  
              }
  
              otherlv_10=(Token)match(input,29,FOLLOW_84); if (state.failed) return current;
              if ( state.backtracking==0 ) {
  
                			newLeafNode(otherlv_10, grammarAccess.getXSwitchExpressionAccess().getLeftCurlyBracketKeyword_3());
                		
              }
              // InternalSARL.g:8689:3: ( (lv_cases_11_0= ruleXCasePart ) )*
              loop233:
              do {
                  int alt233=2;
                  int LA233_0 = input.LA(1);
  
                  if ( (LA233_0==RULE_ID||LA233_0==32||LA233_0==44||LA233_0==46||LA233_0==49||LA233_0==76||(LA233_0>=92 && LA233_0<=95)||LA233_0==98) ) {
                      alt233=1;
                  }
  
  
                  switch (alt233) {
              	case 1 :
              	    // InternalSARL.g:8690:4: (lv_cases_11_0= ruleXCasePart )
              	    {
              	    // InternalSARL.g:8690:4: (lv_cases_11_0= ruleXCasePart )
              	    // InternalSARL.g:8691:5: lv_cases_11_0= ruleXCasePart
              	    {
              	    if ( state.backtracking==0 ) {
  
              	      					newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getCasesXCasePartParserRuleCall_4_0());
              	      				
              	    }
              	    pushFollow(FOLLOW_84);
              	    lv_cases_11_0=ruleXCasePart();
  
              	    state._fsp--;
              	    if (state.failed) return current;
              	    if ( state.backtracking==0 ) {
  
              	      					if (current==null) {
              	      						current = createModelElementForParent(grammarAccess.getXSwitchExpressionRule());
              	      					}
              	      					add(
              	      						current,
              	      						"cases",
              	      						lv_cases_11_0,
              	      						"org.eclipse.xtend.core.Xtend.XCasePart");
              	      					afterParserOrEnumRuleCall();
              	      				
              	    }
  
              	    }
  
  
              	    }
              	    break;
  
              	default :
              	    break loop233;
                  }
              } while (true);
  
              // InternalSARL.g:8708:3: (otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) ) )?
              int alt234=2;
              int LA234_0 = input.LA(1);
  
              if ( (LA234_0==69) ) {
                  alt234=1;
              }
              switch (alt234) {
                  case 1 :
                      // InternalSARL.g:8709:4: otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) )
                      {
                      otherlv_12=(Token)match(input,69,FOLLOW_40); if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        				newLeafNode(otherlv_12, grammarAccess.getXSwitchExpressionAccess().getDefaultKeyword_5_0());
                        			
                      }
                      otherlv_13=(Token)match(input,46,FOLLOW_45); if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        				newLeafNode(otherlv_13, grammarAccess.getXSwitchExpressionAccess().getColonKeyword_5_1());
                        			
                      }
                      // InternalSARL.g:8717:4: ( (lv_default_14_0= ruleXExpression ) )
                      // InternalSARL.g:8718:5: (lv_default_14_0= ruleXExpression )
                      {
                      // InternalSARL.g:8718:5: (lv_default_14_0= ruleXExpression )
                      // InternalSARL.g:8719:6: lv_default_14_0= ruleXExpression
                      {
                      if ( state.backtracking==0 ) {
  
                        						newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getDefaultXExpressionParserRuleCall_5_2_0());
                        					
                      }
                      pushFollow(FOLLOW_24);
                      lv_default_14_0=ruleXExpression();
  
                      state._fsp--;
                      if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        						if (current==null) {
                        							current = createModelElementForParent(grammarAccess.getXSwitchExpressionRule());
                        						}
                        						set(
                        							current,
                        							"default",
                        							lv_default_14_0,
                        							"org.eclipse.xtext.xbase.Xbase.XExpression");
                        						afterParserOrEnumRuleCall();
                        					
                      }
  
                      }
  
  
                      }
  
  
                      }
                      break;
  
              }
  
              otherlv_15=(Token)match(input,30,FOLLOW_2); if (state.failed) return current;
              if ( state.backtracking==0 ) {
  
                			newLeafNode(otherlv_15, grammarAccess.getXSwitchExpressionAccess().getRightCurlyBracketKeyword_6());
                		
              }
  
              }
  
  
              }
  
              if ( state.backtracking==0 ) {
  
                	leaveRule();
  
              }
          }
  
              catch (RecognitionException re) {
                  recover(input,re);
                  appendSkippedTokens();
              }
          finally {
          }
          return current;
      }