docs: public final void forStatement() throws RecognitionException {
  		VarDecl_stack.push(new VarDecl_scope());
  
  		int forStatement_StartIndex = input.index();
  
  		Token x=null;
  		Token y=null;
  		Token id=null;
  		Token z=null;
  		ParserRuleReturnScope bs =null;
  		ParserRuleReturnScope variableModifier4 =null;
  		ParserRuleReturnScope type5 =null;
  
  
  		         JavaForBlockDescr fd = null;
  		         increaseLevel();
  		         VarDecl_stack.peek().descr = new JavaLocalDeclarationDescr();
  		    
  		try {
  			if ( state.backtracking>0 && alreadyParsedRule(input, 86) ) { return; }
  
  			// src/main/resources/org/drools/compiler/semantics/java/parser/Java.g:813:5: (x= 'for' y= '(' ( ( ( variableModifier )* type id= Identifier z= ':' expression ) | ( ( forInit )? z= ';' ( expression )? ';' ( forUpdate )? ) ) ')' bs= statement )
  			// src/main/resources/org/drools/compiler/semantics/java/parser/Java.g:814:5: x= 'for' y= '(' ( ( ( variableModifier )* type id= Identifier z= ':' expression ) | ( ( forInit )? z= ';' ( expression )? ';' ( forUpdate )? ) ) ')' bs= statement
  			{
  			x=(Token)match(input,86,FOLLOW_86_in_forStatement3409); if (state.failed) return;
  			y=(Token)match(input,36,FOLLOW_36_in_forStatement3413); if (state.failed) return;
  			if ( state.backtracking==0 ) {   fd = new JavaForBlockDescr( ); 
  			        fd.setStart( ((CommonToken)x).getStartIndex() ); pushContainerBlockDescr(fd, true);    
  			        fd.setStartParen( ((CommonToken)y).getStartIndex() );            
  			    }
  			// src/main/resources/org/drools/compiler/semantics/java/parser/Java.g:819:5: ( ( ( variableModifier )* type id= Identifier z= ':' expression ) | ( ( forInit )? z= ';' ( expression )? ';' ( forUpdate )? ) )
  			int alt118=2;
  			alt118 = dfa118.predict(input);
  			switch (alt118) {
  				case 1 :
  					// src/main/resources/org/drools/compiler/semantics/java/parser/Java.g:820:9: ( ( variableModifier )* type id= Identifier z= ':' expression )
  					{
  					// src/main/resources/org/drools/compiler/semantics/java/parser/Java.g:820:9: ( ( variableModifier )* type id= Identifier z= ':' expression )
  					// src/main/resources/org/drools/compiler/semantics/java/parser/Java.g:820:11: ( variableModifier )* type id= Identifier z= ':' expression
  					{
  					// src/main/resources/org/drools/compiler/semantics/java/parser/Java.g:820:11: ( variableModifier )*
  					loop114:
  					while (true) {
  						int alt114=2;
  						int LA114_0 = input.LA(1);
  						if ( (LA114_0==58||LA114_0==83) ) {
  							alt114=1;
  						}
  
  						switch (alt114) {
  						case 1 :
  							// src/main/resources/org/drools/compiler/semantics/java/parser/Java.g:820:13: variableModifier
  							{
  							pushFollow(FOLLOW_variableModifier_in_forStatement3449);
  							variableModifier4=variableModifier();
  							state._fsp--;
  							if (state.failed) return;
  							if ( state.backtracking==0 ) {
  							                VarDecl_stack.peek().descr.updateStart( ((CommonToken)(variableModifier4!=null?(variableModifier4.start):null)).getStartIndex() - 1 );
  							                VarDecl_stack.peek().descr.addModifier( (variableModifier4!=null?input.toString(variableModifier4.start,variableModifier4.stop):null) );
  							            }
  							}
  							break;
  
  						default :
  							break loop114;
  						}
  					}
  
  					pushFollow(FOLLOW_type_in_forStatement3488);
  					type5=type();
  					state._fsp--;
  					if (state.failed) return;
  					if ( state.backtracking==0 ) {
  					            VarDecl_stack.peek().descr.updateStart( ((CommonToken)(type5!=null?(type5.start):null)).getStartIndex() - 1 );
  					            VarDecl_stack.peek().descr.setType( (type5!=null?input.toString(type5.start,type5.stop):null) );
  					            VarDecl_stack.peek().descr.setEnd( ((CommonToken)(type5!=null?(type5.stop):null)).getStopIndex() );
  					          }
  					id=(Token)match(input,Identifier,FOLLOW_Identifier_in_forStatement3514); if (state.failed) return;
  					if ( state.backtracking==0 ) {
  					            JavaLocalDeclarationDescr.IdentifierDescr ident = new JavaLocalDeclarationDescr.IdentifierDescr();
  					            ident.setIdentifier( (id!=null?id.getText():null) );
  					            ident.setStart( ((CommonToken)id).getStartIndex() - 1 );
  					            ident.setEnd( ((CommonToken)id).getStopIndex() );
  					            VarDecl_stack.peek().descr.addIdentifier( ident );
  					          }
  					z=(Token)match(input,51,FOLLOW_51_in_forStatement3541); if (state.failed) return;
  					pushFollow(FOLLOW_expression_in_forStatement3543);
  					expression();
  					state._fsp--;
  					if (state.failed) return;
  					if ( state.backtracking==0 ) {
  					             fd.setInitEnd( ((CommonToken)z).getStartIndex() );        
  					          }
  					}
  
  					}
  					break;
  				case 2 :
  					// src/main/resources/org/drools/compiler/semantics/java/parser/Java.g:845:9: ( ( forInit )? z= ';' ( expression )? ';' ( forUpdate )? )
  					{
  					// src/main/resources/org/drools/compiler/semantics/java/parser/Java.g:845:9: ( ( forInit )? z= ';' ( expression )? ';' ( forUpdate )? )
  					// src/main/resources/org/drools/compiler/semantics/java/parser/Java.g:845:10: ( forInit )? z= ';' ( expression )? ';' ( forUpdate )?
  					{
  					// src/main/resources/org/drools/compiler/semantics/java/parser/Java.g:845:10: ( forInit )?
  					int alt115=2;
  					int LA115_0 = input.LA(1);
  					if ( ((LA115_0 >= CharacterLiteral && LA115_0 <= DecimalLiteral)||LA115_0==FloatingPointLiteral||(LA115_0 >= HexLiteral && LA115_0 <= Identifier)||(LA115_0 >= OctalLiteral && LA115_0 <= StringLiteral)||LA115_0==29||LA115_0==36||(LA115_0 >= 40 && LA115_0 <= 41)||(LA115_0 >= 44 && LA115_0 <= 45)||LA115_0==53||LA115_0==58||LA115_0==65||LA115_0==67||(LA115_0 >= 70 && LA115_0 <= 71)||LA115_0==77||(LA115_0 >= 79 && LA115_0 <= 80)||(LA115_0 >= 82 && LA115_0 <= 83)||LA115_0==85||LA115_0==92||LA115_0==94||(LA115_0 >= 97 && LA115_0 <= 98)||LA115_0==105||LA115_0==108||LA115_0==111||LA115_0==115||LA115_0==118||LA115_0==126) ) {
  						alt115=1;
  					}
  					switch (alt115) {
  						case 1 :
  							// src/main/resources/org/drools/compiler/semantics/java/parser/Java.g:845:10: forInit
  							{
  							pushFollow(FOLLOW_forInit_in_forStatement3579);
  							forInit();
  							state._fsp--;
  							if (state.failed) return;
  							}
  							break;
  
  					}
  
  					z=(Token)match(input,52,FOLLOW_52_in_forStatement3584); if (state.failed) return;
  					// src/main/resources/org/drools/compiler/semantics/java/parser/Java.g:845:25: ( expression )?
  					int alt116=2;
  					int LA116_0 = input.LA(1);
  					if ( ((LA116_0 >= CharacterLiteral && LA116_0 <= DecimalLiteral)||LA116_0==FloatingPointLiteral||(LA116_0 >= HexLiteral && LA116_0 <= Identifier)||(LA116_0 >= OctalLiteral && LA116_0 <= StringLiteral)||LA116_0==29||LA116_0==36||(LA116_0 >= 40 && LA116_0 <= 41)||(LA116_0 >= 44 && LA116_0 <= 45)||LA116_0==53||LA116_0==65||LA116_0==67||(LA116_0 >= 70 && LA116_0 <= 71)||LA116_0==77||(LA116_0 >= 79 && LA116_0 <= 80)||LA116_0==82||LA116_0==85||LA116_0==92||LA116_0==94||(LA116_0 >= 97 && LA116_0 <= 98)||LA116_0==105||LA116_0==108||LA116_0==111||LA116_0==115||LA116_0==118||LA116_0==126) ) {
  						alt116=1;
  					}
  					switch (alt116) {
  						case 1 :
  							// src/main/resources/org/drools/compiler/semantics/java/parser/Java.g:845:25: expression
  							{
  							pushFollow(FOLLOW_expression_in_forStatement3586);
  							expression();
  							state._fsp--;
  							if (state.failed) return;
  							}
  							break;
  
  					}
  
  					match(input,52,FOLLOW_52_in_forStatement3589); if (state.failed) return;
  					// src/main/resources/org/drools/compiler/semantics/java/parser/Java.g:845:41: ( forUpdate )?
  					int alt117=2;
  					int LA117_0 = input.LA(1);
  					if ( ((LA117_0 >= CharacterLiteral && LA117_0 <= DecimalLiteral)||LA117_0==FloatingPointLiteral||(LA117_0 >= HexLiteral && LA117_0 <= Identifier)||(LA117_0 >= OctalLiteral && LA117_0 <= StringLiteral)||LA117_0==29||LA117_0==36||(LA117_0 >= 40 && LA117_0 <= 41)||(LA117_0 >= 44 && LA117_0 <= 45)||LA117_0==53||LA117_0==65||LA117_0==67||(LA117_0 >= 70 && LA117_0 <= 71)||LA117_0==77||(LA117_0 >= 79 && LA117_0 <= 80)||LA117_0==82||LA117_0==85||LA117_0==92||LA117_0==94||(LA117_0 >= 97 && LA117_0 <= 98)||LA117_0==105||LA117_0==108||LA117_0==111||LA117_0==115||LA117_0==118||LA117_0==126) ) {
  						alt117=1;
  					}
  					switch (alt117) {
  						case 1 :
  							// src/main/resources/org/drools/compiler/semantics/java/parser/Java.g:845:41: forUpdate
  							{
  							pushFollow(FOLLOW_forUpdate_in_forStatement3591);
  							forUpdate();
  							state._fsp--;
  							if (state.failed) return;
  							}
  							break;
  
  					}
  
  					if ( state.backtracking==0 ) {
  					             fd.setInitEnd( ((CommonToken)z).getStartIndex() );        
  					          }
  					}
  
  					}
  					break;
  
  			}
  
  			match(input,37,FOLLOW_37_in_forStatement3637); if (state.failed) return;
  			pushFollow(FOLLOW_statement_in_forStatement3641);
  			bs=statement();
  			state._fsp--;
  			if (state.failed) return;
  			if ( state.backtracking==0 ) {                
  			        fd.setTextStart(((CommonToken)(bs!=null?(bs.start):null)).getStartIndex() );
  			        fd.setEnd(((CommonToken)(bs!=null?(bs.stop):null)).getStopIndex() ); popContainerBlockDescr();     
  			    }
  			}
  
  			if ( state.backtracking==0 ) {
  			         addLocalDeclaration( VarDecl_stack.peek().descr );
  			         decreaseLevel();
  			    }
  		}
  		catch (RecognitionException re) {
  			reportError(re);
  			recover(input,re);
  		}
  		finally {
  			// do for sure before leaving
  			if ( state.backtracking>0 ) { memoize(input, 86, forStatement_StartIndex); }
  
  			VarDecl_stack.pop();
  
  		}
  	}