docs: public final void ifStatement() throws RecognitionException {
  		int ifStatement_StartIndex = input.index();
  
  		Token s=null;
  		Token y=null;
  		ParserRuleReturnScope x =null;
  		ParserRuleReturnScope z =null;
  
  
  		         JavaIfBlockDescr id = null;
  		         JavaElseBlockDescr ed = null;         
  		    
  		try {
  			if ( state.backtracking>0 && alreadyParsedRule(input, 85) ) { return; }
  
  			// src/main/resources/org/drools/compiler/semantics/java/parser/Java.g:771:5: (s= 'if' parExpression x= statement (y= 'else' ( 'if' parExpression )? z= statement )* )
  			// src/main/resources/org/drools/compiler/semantics/java/parser/Java.g:773:5: s= 'if' parExpression x= statement (y= 'else' ( 'if' parExpression )? z= statement )*
  			{
  			s=(Token)match(input,87,FOLLOW_87_in_ifStatement3243); if (state.failed) return;
  			pushFollow(FOLLOW_parExpression_in_ifStatement3245);
  			parExpression();
  			state._fsp--;
  			if (state.failed) return;
  			if ( state.backtracking==0 ) {
  			        increaseLevel();
  			        id = new JavaIfBlockDescr();
  			        id.setStart( ((CommonToken)s).getStartIndex() );  pushContainerBlockDescr(id, true); 
  			    }
  			pushFollow(FOLLOW_statement_in_ifStatement3263);
  			x=statement();
  			state._fsp--;
  			if (state.failed) return;
  			if ( state.backtracking==0 ) {
  			        decreaseLevel();
  			        id.setTextStart(((CommonToken)(x!=null?(x.start):null)).getStartIndex() );
  			        id.setEnd(((CommonToken)(x!=null?(x.stop):null)).getStopIndex() ); popContainerBlockDescr(); 
  			    }
  			// src/main/resources/org/drools/compiler/semantics/java/parser/Java.g:786:5: (y= 'else' ( 'if' parExpression )? z= statement )*
  			loop113:
  			while (true) {
  				int alt113=2;
  				alt113 = dfa113.predict(input);
  				switch (alt113) {
  				case 1 :
  					// src/main/resources/org/drools/compiler/semantics/java/parser/Java.g:787:6: y= 'else' ( 'if' parExpression )? z= statement
  					{
  					y=(Token)match(input,78,FOLLOW_78_in_ifStatement3290); if (state.failed) return;
  					// src/main/resources/org/drools/compiler/semantics/java/parser/Java.g:787:16: ( 'if' parExpression )?
  					int alt112=2;
  					int LA112_0 = input.LA(1);
  					if ( (LA112_0==87) ) {
  						int LA112_1 = input.LA(2);
  						if ( (LA112_1==36) ) {
  							int LA112_43 = input.LA(3);
  							if ( (synpred171_Java()) ) {
  								alt112=1;
  							}
  						}
  					}
  					switch (alt112) {
  						case 1 :
  							// src/main/resources/org/drools/compiler/semantics/java/parser/Java.g:787:17: 'if' parExpression
  							{
  							match(input,87,FOLLOW_87_in_ifStatement3294); if (state.failed) return;
  							pushFollow(FOLLOW_parExpression_in_ifStatement3296);
  							parExpression();
  							state._fsp--;
  							if (state.failed) return;
  							}
  							break;
  
  					}
  
  					if ( state.backtracking==0 ) {
  					        increaseLevel();
  					        ed = new JavaElseBlockDescr();
  					        ed.setStart( ((CommonToken)y).getStartIndex() );  pushContainerBlockDescr(ed, true); 
  					    }
  					pushFollow(FOLLOW_statement_in_ifStatement3327);
  					z=statement();
  					state._fsp--;
  					if (state.failed) return;
  					if ( state.backtracking==0 ) {
  					        decreaseLevel();
  					        ed.setTextStart(((CommonToken)(z!=null?(z.start):null)).getStartIndex() );
  					        ed.setEnd(((CommonToken)(z!=null?(z.stop):null)).getStopIndex() ); popContainerBlockDescr();               
  					    }
  					}
  					break;
  
  				default :
  					break loop113;
  				}
  			}
  
  			}
  
  		}
  		catch (RecognitionException re) {
  			reportError(re);
  			recover(input,re);
  		}
  		finally {
  			// do for sure before leaving
  			if ( state.backtracking>0 ) { memoize(input, 85, ifStatement_StartIndex); }
  
  		}
  	}