docs: public final EObject ruleXForLoopExpression() 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;
          EObject lv_declaredParam_3_0 = null;
  
          EObject lv_forExpression_5_0 = null;
  
          EObject lv_eachExpression_7_0 = null;
  
  
  
          	enterRule();
  
          try {
              // InternalSARL.g:8339:2: ( ( ( ( ( () 'for' '(' ( ( ruleSarlXLoopFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleSarlXLoopFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_forExpression_5_0= ruleXExpression ) ) otherlv_6= ')' ( ( (lv_eachExpression_7_0= ruleXExpression ) ) | otherlv_8= ';' ) ) )
              // InternalSARL.g:8340:2: ( ( ( ( () 'for' '(' ( ( ruleSarlXLoopFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleSarlXLoopFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_forExpression_5_0= ruleXExpression ) ) otherlv_6= ')' ( ( (lv_eachExpression_7_0= ruleXExpression ) ) | otherlv_8= ';' ) )
              {
              // InternalSARL.g:8340:2: ( ( ( ( () 'for' '(' ( ( ruleSarlXLoopFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleSarlXLoopFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_forExpression_5_0= ruleXExpression ) ) otherlv_6= ')' ( ( (lv_eachExpression_7_0= ruleXExpression ) ) | otherlv_8= ';' ) )
              // InternalSARL.g:8341:3: ( ( ( () 'for' '(' ( ( ruleSarlXLoopFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleSarlXLoopFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_forExpression_5_0= ruleXExpression ) ) otherlv_6= ')' ( ( (lv_eachExpression_7_0= ruleXExpression ) ) | otherlv_8= ';' )
              {
              // InternalSARL.g:8341:3: ( ( ( () 'for' '(' ( ( ruleSarlXLoopFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleSarlXLoopFormalParameter ) ) otherlv_4= ':' ) )
              // InternalSARL.g:8342:4: ( ( () 'for' '(' ( ( ruleSarlXLoopFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleSarlXLoopFormalParameter ) ) otherlv_4= ':' )
              {
              // InternalSARL.g:8355:4: ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleSarlXLoopFormalParameter ) ) otherlv_4= ':' )
              // InternalSARL.g:8356:5: () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleSarlXLoopFormalParameter ) ) otherlv_4= ':'
              {
              // InternalSARL.g:8356:5: ()
              // InternalSARL.g:8357:6: 
              {
              if ( state.backtracking==0 ) {
  
                						current = forceCreateModelElement(
                							grammarAccess.getXForLoopExpressionAccess().getXForLoopExpressionAction_0_0_0(),
                							current);
                					
              }
  
              }
  
              otherlv_1=(Token)match(input,67,FOLLOW_80); if (state.failed) return current;
              if ( state.backtracking==0 ) {
  
                					newLeafNode(otherlv_1, grammarAccess.getXForLoopExpressionAccess().getForKeyword_0_0_1());
                				
              }
              otherlv_2=(Token)match(input,49,FOLLOW_75); if (state.failed) return current;
              if ( state.backtracking==0 ) {
  
                					newLeafNode(otherlv_2, grammarAccess.getXForLoopExpressionAccess().getLeftParenthesisKeyword_0_0_2());
                				
              }
              // InternalSARL.g:8371:5: ( (lv_declaredParam_3_0= ruleSarlXLoopFormalParameter ) )
              // InternalSARL.g:8372:6: (lv_declaredParam_3_0= ruleSarlXLoopFormalParameter )
              {
              // InternalSARL.g:8372:6: (lv_declaredParam_3_0= ruleSarlXLoopFormalParameter )
              // InternalSARL.g:8373:7: lv_declaredParam_3_0= ruleSarlXLoopFormalParameter
              {
              if ( state.backtracking==0 ) {
  
                							newCompositeNode(grammarAccess.getXForLoopExpressionAccess().getDeclaredParamSarlXLoopFormalParameterParserRuleCall_0_0_3_0());
                						
              }
              pushFollow(FOLLOW_40);
              lv_declaredParam_3_0=ruleSarlXLoopFormalParameter();
  
              state._fsp--;
              if (state.failed) return current;
              if ( state.backtracking==0 ) {
  
                							if (current==null) {
                								current = createModelElementForParent(grammarAccess.getXForLoopExpressionRule());
                							}
                							set(
                								current,
                								"declaredParam",
                								lv_declaredParam_3_0,
                								"io.sarl.lang.SARL.SarlXLoopFormalParameter");
                							afterParserOrEnumRuleCall();
                						
              }
  
              }
  
  
              }
  
              otherlv_4=(Token)match(input,46,FOLLOW_45); if (state.failed) return current;
              if ( state.backtracking==0 ) {
  
                					newLeafNode(otherlv_4, grammarAccess.getXForLoopExpressionAccess().getColonKeyword_0_0_4());
                				
              }
  
              }
  
  
              }
  
              // InternalSARL.g:8396:3: ( (lv_forExpression_5_0= ruleXExpression ) )
              // InternalSARL.g:8397:4: (lv_forExpression_5_0= ruleXExpression )
              {
              // InternalSARL.g:8397:4: (lv_forExpression_5_0= ruleXExpression )
              // InternalSARL.g:8398:5: lv_forExpression_5_0= ruleXExpression
              {
              if ( state.backtracking==0 ) {
  
                					newCompositeNode(grammarAccess.getXForLoopExpressionAccess().getForExpressionXExpressionParserRuleCall_1_0());
                				
              }
              pushFollow(FOLLOW_81);
              lv_forExpression_5_0=ruleXExpression();
  
              state._fsp--;
              if (state.failed) return current;
              if ( state.backtracking==0 ) {
  
                					if (current==null) {
                						current = createModelElementForParent(grammarAccess.getXForLoopExpressionRule());
                					}
                					set(
                						current,
                						"forExpression",
                						lv_forExpression_5_0,
                						"org.eclipse.xtext.xbase.Xbase.XExpression");
                					afterParserOrEnumRuleCall();
                				
              }
  
              }
  
  
              }
  
              otherlv_6=(Token)match(input,50,FOLLOW_82); if (state.failed) return current;
              if ( state.backtracking==0 ) {
  
                			newLeafNode(otherlv_6, grammarAccess.getXForLoopExpressionAccess().getRightParenthesisKeyword_2());
                		
              }
              // InternalSARL.g:8419:3: ( ( (lv_eachExpression_7_0= ruleXExpression ) ) | otherlv_8= ';' )
              int alt228=2;
              int LA228_0 = input.LA(1);
  
              if ( ((LA228_0>=RULE_STRING && LA228_0<=RULE_RICH_TEXT_START)||(LA228_0>=RULE_HEX && LA228_0<=RULE_DECIMAL)||LA228_0==25||(LA228_0>=28 && LA228_0<=29)||LA228_0==36||(LA228_0>=39 && LA228_0<=40)||(LA228_0>=42 && LA228_0<=45)||(LA228_0>=48 && LA228_0<=49)||LA228_0==51||LA228_0==55||(LA228_0>=60 && LA228_0<=63)||(LA228_0>=67 && LA228_0<=68)||(LA228_0>=73 && LA228_0<=75)||(LA228_0>=78 && LA228_0<=96)||LA228_0==106||LA228_0==129||(LA228_0>=131 && LA228_0<=140)) ) {
                  alt228=1;
              }
              else if ( (LA228_0==26) ) {
                  alt228=2;
              }
              else {
                  if (state.backtracking>0) {state.failed=true; return current;}
                  NoViableAltException nvae =
                      new NoViableAltException("", 228, 0, input);
  
                  throw nvae;
              }
              switch (alt228) {
                  case 1 :
                      // InternalSARL.g:8420:4: ( (lv_eachExpression_7_0= ruleXExpression ) )
                      {
                      // InternalSARL.g:8420:4: ( (lv_eachExpression_7_0= ruleXExpression ) )
                      // InternalSARL.g:8421:5: (lv_eachExpression_7_0= ruleXExpression )
                      {
                      // InternalSARL.g:8421:5: (lv_eachExpression_7_0= ruleXExpression )
                      // InternalSARL.g:8422:6: lv_eachExpression_7_0= ruleXExpression
                      {
                      if ( state.backtracking==0 ) {
  
                        						newCompositeNode(grammarAccess.getXForLoopExpressionAccess().getEachExpressionXExpressionParserRuleCall_3_0_0());
                        					
                      }
                      pushFollow(FOLLOW_2);
                      lv_eachExpression_7_0=ruleXExpression();
  
                      state._fsp--;
                      if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        						if (current==null) {
                        							current = createModelElementForParent(grammarAccess.getXForLoopExpressionRule());
                        						}
                        						set(
                        							current,
                        							"eachExpression",
                        							lv_eachExpression_7_0,
                        							"org.eclipse.xtext.xbase.Xbase.XExpression");
                        						afterParserOrEnumRuleCall();
                        					
                      }
  
                      }
  
  
                      }
  
  
                      }
                      break;
                  case 2 :
                      // InternalSARL.g:8440:4: otherlv_8= ';'
                      {
                      otherlv_8=(Token)match(input,26,FOLLOW_2); if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        				newLeafNode(otherlv_8, grammarAccess.getXForLoopExpressionAccess().getSemicolonKeyword_3_1());
                        			
                      }
  
                      }
                      break;
  
              }
  
  
              }
  
  
              }
  
              if ( state.backtracking==0 ) {
  
                	leaveRule();
  
              }
          }
  
              catch (RecognitionException re) {
                  recover(input,re);
                  appendSkippedTokens();
              }
          finally {
          }
          return current;
      }