docs: public final EObject ruleXDoWhileExpression() throws RecognitionException {
          EObject current = null;
  
          Token otherlv_1=null;
          Token otherlv_3=null;
          Token otherlv_4=null;
          Token otherlv_6=null;
          EObject lv_body_2_0 = null;
  
          EObject lv_predicate_5_0 = null;
  
  
  
          	enterRule();
  
          try {
              // InternalSARL.g:14681:2: ( ( () otherlv_1= 'do' ( (lv_body_2_0= ruleXExpression ) ) otherlv_3= 'while' otherlv_4= '(' ( (lv_predicate_5_0= ruleXExpression ) ) otherlv_6= ')' ) )
              // InternalSARL.g:14682:2: ( () otherlv_1= 'do' ( (lv_body_2_0= ruleXExpression ) ) otherlv_3= 'while' otherlv_4= '(' ( (lv_predicate_5_0= ruleXExpression ) ) otherlv_6= ')' )
              {
              // InternalSARL.g:14682:2: ( () otherlv_1= 'do' ( (lv_body_2_0= ruleXExpression ) ) otherlv_3= 'while' otherlv_4= '(' ( (lv_predicate_5_0= ruleXExpression ) ) otherlv_6= ')' )
              // InternalSARL.g:14683:3: () otherlv_1= 'do' ( (lv_body_2_0= ruleXExpression ) ) otherlv_3= 'while' otherlv_4= '(' ( (lv_predicate_5_0= ruleXExpression ) ) otherlv_6= ')'
              {
              // InternalSARL.g:14683:3: ()
              // InternalSARL.g:14684:4: 
              {
              if ( state.backtracking==0 ) {
  
                				current = forceCreateModelElement(
                					grammarAccess.getXDoWhileExpressionAccess().getXDoWhileExpressionAction_0(),
                					current);
                			
              }
  
              }
  
              otherlv_1=(Token)match(input,132,FOLLOW_45); if (state.failed) return current;
              if ( state.backtracking==0 ) {
  
                			newLeafNode(otherlv_1, grammarAccess.getXDoWhileExpressionAccess().getDoKeyword_1());
                		
              }
              // InternalSARL.g:14694:3: ( (lv_body_2_0= ruleXExpression ) )
              // InternalSARL.g:14695:4: (lv_body_2_0= ruleXExpression )
              {
              // InternalSARL.g:14695:4: (lv_body_2_0= ruleXExpression )
              // InternalSARL.g:14696:5: lv_body_2_0= ruleXExpression
              {
              if ( state.backtracking==0 ) {
  
                					newCompositeNode(grammarAccess.getXDoWhileExpressionAccess().getBodyXExpressionParserRuleCall_2_0());
                				
              }
              pushFollow(FOLLOW_144);
              lv_body_2_0=ruleXExpression();
  
              state._fsp--;
              if (state.failed) return current;
              if ( state.backtracking==0 ) {
  
                					if (current==null) {
                						current = createModelElementForParent(grammarAccess.getXDoWhileExpressionRule());
                					}
                					set(
                						current,
                						"body",
                						lv_body_2_0,
                						"org.eclipse.xtext.xbase.Xbase.XExpression");
                					afterParserOrEnumRuleCall();
                				
              }
  
              }
  
  
              }
  
              otherlv_3=(Token)match(input,131,FOLLOW_80); if (state.failed) return current;
              if ( state.backtracking==0 ) {
  
                			newLeafNode(otherlv_3, grammarAccess.getXDoWhileExpressionAccess().getWhileKeyword_3());
                		
              }
              otherlv_4=(Token)match(input,49,FOLLOW_45); if (state.failed) return current;
              if ( state.backtracking==0 ) {
  
                			newLeafNode(otherlv_4, grammarAccess.getXDoWhileExpressionAccess().getLeftParenthesisKeyword_4());
                		
              }
              // InternalSARL.g:14721:3: ( (lv_predicate_5_0= ruleXExpression ) )
              // InternalSARL.g:14722:4: (lv_predicate_5_0= ruleXExpression )
              {
              // InternalSARL.g:14722:4: (lv_predicate_5_0= ruleXExpression )
              // InternalSARL.g:14723:5: lv_predicate_5_0= ruleXExpression
              {
              if ( state.backtracking==0 ) {
  
                					newCompositeNode(grammarAccess.getXDoWhileExpressionAccess().getPredicateXExpressionParserRuleCall_5_0());
                				
              }
              pushFollow(FOLLOW_81);
              lv_predicate_5_0=ruleXExpression();
  
              state._fsp--;
              if (state.failed) return current;
              if ( state.backtracking==0 ) {
  
                					if (current==null) {
                						current = createModelElementForParent(grammarAccess.getXDoWhileExpressionRule());
                					}
                					set(
                						current,
                						"predicate",
                						lv_predicate_5_0,
                						"org.eclipse.xtext.xbase.Xbase.XExpression");
                					afterParserOrEnumRuleCall();
                				
              }
  
              }
  
  
              }
  
              otherlv_6=(Token)match(input,50,FOLLOW_2); if (state.failed) return current;
              if ( state.backtracking==0 ) {
  
                			newLeafNode(otherlv_6, grammarAccess.getXDoWhileExpressionAccess().getRightParenthesisKeyword_6());
                		
              }
  
              }
  
  
              }
  
              if ( state.backtracking==0 ) {
  
                	leaveRule();
  
              }
          }
  
              catch (RecognitionException re) {
                  recover(input,re);
                  appendSkippedTokens();
              }
          finally {
          }
          return current;
      }