docs: public final EObject ruleXTryCatchFinallyExpression() throws RecognitionException {
          EObject current = null;
  
          Token otherlv_1=null;
          Token otherlv_4=null;
          Token otherlv_6=null;
          EObject lv_expression_2_0 = null;
  
          EObject lv_catchClauses_3_0 = null;
  
          EObject lv_finallyExpression_5_0 = null;
  
          EObject lv_finallyExpression_7_0 = null;
  
  
  
          	enterRule();
  
          try {
              // InternalSARL.g:15467:2: ( ( () otherlv_1= 'try' ( (lv_expression_2_0= ruleXExpression ) ) ( ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? ) | (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) ) ) ) )
              // InternalSARL.g:15468:2: ( () otherlv_1= 'try' ( (lv_expression_2_0= ruleXExpression ) ) ( ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? ) | (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) ) ) )
              {
              // InternalSARL.g:15468:2: ( () otherlv_1= 'try' ( (lv_expression_2_0= ruleXExpression ) ) ( ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? ) | (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) ) ) )
              // InternalSARL.g:15469:3: () otherlv_1= 'try' ( (lv_expression_2_0= ruleXExpression ) ) ( ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? ) | (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) ) )
              {
              // InternalSARL.g:15469:3: ()
              // InternalSARL.g:15470:4: 
              {
              if ( state.backtracking==0 ) {
  
                				current = forceCreateModelElement(
                					grammarAccess.getXTryCatchFinallyExpressionAccess().getXTryCatchFinallyExpressionAction_0(),
                					current);
                			
              }
  
              }
  
              otherlv_1=(Token)match(input,140,FOLLOW_45); if (state.failed) return current;
              if ( state.backtracking==0 ) {
  
                			newLeafNode(otherlv_1, grammarAccess.getXTryCatchFinallyExpressionAccess().getTryKeyword_1());
                		
              }
              // InternalSARL.g:15480:3: ( (lv_expression_2_0= ruleXExpression ) )
              // InternalSARL.g:15481:4: (lv_expression_2_0= ruleXExpression )
              {
              // InternalSARL.g:15481:4: (lv_expression_2_0= ruleXExpression )
              // InternalSARL.g:15482:5: lv_expression_2_0= ruleXExpression
              {
              if ( state.backtracking==0 ) {
  
                					newCompositeNode(grammarAccess.getXTryCatchFinallyExpressionAccess().getExpressionXExpressionParserRuleCall_2_0());
                				
              }
              pushFollow(FOLLOW_149);
              lv_expression_2_0=ruleXExpression();
  
              state._fsp--;
              if (state.failed) return current;
              if ( state.backtracking==0 ) {
  
                					if (current==null) {
                						current = createModelElementForParent(grammarAccess.getXTryCatchFinallyExpressionRule());
                					}
                					set(
                						current,
                						"expression",
                						lv_expression_2_0,
                						"org.eclipse.xtext.xbase.Xbase.XExpression");
                					afterParserOrEnumRuleCall();
                				
              }
  
              }
  
  
              }
  
              // InternalSARL.g:15499:3: ( ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? ) | (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) ) )
              int alt359=2;
              int LA359_0 = input.LA(1);
  
              if ( (LA359_0==142) ) {
                  alt359=1;
              }
              else if ( (LA359_0==141) ) {
                  alt359=2;
              }
              else {
                  if (state.backtracking>0) {state.failed=true; return current;}
                  NoViableAltException nvae =
                      new NoViableAltException("", 359, 0, input);
  
                  throw nvae;
              }
              switch (alt359) {
                  case 1 :
                      // InternalSARL.g:15500:4: ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? )
                      {
                      // InternalSARL.g:15500:4: ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? )
                      // InternalSARL.g:15501:5: ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )?
                      {
                      // InternalSARL.g:15501:5: ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+
                      int cnt357=0;
                      loop357:
                      do {
                          int alt357=2;
                          int LA357_0 = input.LA(1);
  
                          if ( (LA357_0==142) ) {
                              int LA357_2 = input.LA(2);
  
                              if ( (synpred56_InternalSARL()) ) {
                                  alt357=1;
                              }
  
  
                          }
  
  
                          switch (alt357) {
                      	case 1 :
                      	    // InternalSARL.g:15502:6: ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause )
                      	    {
                      	    // InternalSARL.g:15503:6: (lv_catchClauses_3_0= ruleXCatchClause )
                      	    // InternalSARL.g:15504:7: lv_catchClauses_3_0= ruleXCatchClause
                      	    {
                      	    if ( state.backtracking==0 ) {
  
                      	      							newCompositeNode(grammarAccess.getXTryCatchFinallyExpressionAccess().getCatchClausesXCatchClauseParserRuleCall_3_0_0_0());
                      	      						
                      	    }
                      	    pushFollow(FOLLOW_150);
                      	    lv_catchClauses_3_0=ruleXCatchClause();
  
                      	    state._fsp--;
                      	    if (state.failed) return current;
                      	    if ( state.backtracking==0 ) {
  
                      	      							if (current==null) {
                      	      								current = createModelElementForParent(grammarAccess.getXTryCatchFinallyExpressionRule());
                      	      							}
                      	      							add(
                      	      								current,
                      	      								"catchClauses",
                      	      								lv_catchClauses_3_0,
                      	      								"org.eclipse.xtext.xbase.Xbase.XCatchClause");
                      	      							afterParserOrEnumRuleCall();
                      	      						
                      	    }
  
                      	    }
  
  
                      	    }
                      	    break;
  
                      	default :
                      	    if ( cnt357 >= 1 ) break loop357;
                      	    if (state.backtracking>0) {state.failed=true; return current;}
                                  EarlyExitException eee =
                                      new EarlyExitException(357, input);
                                  throw eee;
                          }
                          cnt357++;
                      } while (true);
  
                      // InternalSARL.g:15521:5: ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )?
                      int alt358=2;
                      int LA358_0 = input.LA(1);
  
                      if ( (LA358_0==141) ) {
                          int LA358_1 = input.LA(2);
  
                          if ( (synpred57_InternalSARL()) ) {
                              alt358=1;
                          }
                      }
                      switch (alt358) {
                          case 1 :
                              // InternalSARL.g:15522:6: ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) )
                              {
                              // InternalSARL.g:15522:6: ( ( 'finally' )=>otherlv_4= 'finally' )
                              // InternalSARL.g:15523:7: ( 'finally' )=>otherlv_4= 'finally'
                              {
                              otherlv_4=(Token)match(input,141,FOLLOW_45); if (state.failed) return current;
                              if ( state.backtracking==0 ) {
  
                                							newLeafNode(otherlv_4, grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyKeyword_3_0_1_0());
                                						
                              }
  
                              }
  
                              // InternalSARL.g:15529:6: ( (lv_finallyExpression_5_0= ruleXExpression ) )
                              // InternalSARL.g:15530:7: (lv_finallyExpression_5_0= ruleXExpression )
                              {
                              // InternalSARL.g:15530:7: (lv_finallyExpression_5_0= ruleXExpression )
                              // InternalSARL.g:15531:8: lv_finallyExpression_5_0= ruleXExpression
                              {
                              if ( state.backtracking==0 ) {
  
                                								newCompositeNode(grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyExpressionXExpressionParserRuleCall_3_0_1_1_0());
                                							
                              }
                              pushFollow(FOLLOW_2);
                              lv_finallyExpression_5_0=ruleXExpression();
  
                              state._fsp--;
                              if (state.failed) return current;
                              if ( state.backtracking==0 ) {
  
                                								if (current==null) {
                                									current = createModelElementForParent(grammarAccess.getXTryCatchFinallyExpressionRule());
                                								}
                                								set(
                                									current,
                                									"finallyExpression",
                                									lv_finallyExpression_5_0,
                                									"org.eclipse.xtext.xbase.Xbase.XExpression");
                                								afterParserOrEnumRuleCall();
                                							
                              }
  
                              }
  
  
                              }
  
  
                              }
                              break;
  
                      }
  
  
                      }
  
  
                      }
                      break;
                  case 2 :
                      // InternalSARL.g:15551:4: (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) )
                      {
                      // InternalSARL.g:15551:4: (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) )
                      // InternalSARL.g:15552:5: otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) )
                      {
                      otherlv_6=(Token)match(input,141,FOLLOW_45); if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        					newLeafNode(otherlv_6, grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyKeyword_3_1_0());
                        				
                      }
                      // InternalSARL.g:15556:5: ( (lv_finallyExpression_7_0= ruleXExpression ) )
                      // InternalSARL.g:15557:6: (lv_finallyExpression_7_0= ruleXExpression )
                      {
                      // InternalSARL.g:15557:6: (lv_finallyExpression_7_0= ruleXExpression )
                      // InternalSARL.g:15558:7: lv_finallyExpression_7_0= ruleXExpression
                      {
                      if ( state.backtracking==0 ) {
  
                        							newCompositeNode(grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyExpressionXExpressionParserRuleCall_3_1_1_0());
                        						
                      }
                      pushFollow(FOLLOW_2);
                      lv_finallyExpression_7_0=ruleXExpression();
  
                      state._fsp--;
                      if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        							if (current==null) {
                        								current = createModelElementForParent(grammarAccess.getXTryCatchFinallyExpressionRule());
                        							}
                        							set(
                        								current,
                        								"finallyExpression",
                        								lv_finallyExpression_7_0,
                        								"org.eclipse.xtext.xbase.Xbase.XExpression");
                        							afterParserOrEnumRuleCall();
                        						
                      }
  
                      }
  
  
                      }
  
  
                      }
  
  
                      }
                      break;
  
              }
  
  
              }
  
  
              }
  
              if ( state.backtracking==0 ) {
  
                	leaveRule();
  
              }
          }
  
              catch (RecognitionException re) {
                  recover(input,re);
                  appendSkippedTokens();
              }
          finally {
          }
          return current;
      }