docs: public final EObject ruleRichStringForLoop() throws RecognitionException {
          EObject current = null;
  
          Token otherlv_1=null;
          Token otherlv_3=null;
          Token otherlv_5=null;
          Token otherlv_7=null;
          Token otherlv_9=null;
          Token otherlv_12=null;
          EObject lv_declaredParam_2_0 = null;
  
          EObject lv_forExpression_4_0 = null;
  
          EObject lv_before_6_0 = null;
  
          EObject lv_separator_8_0 = null;
  
          EObject lv_after_10_0 = null;
  
          EObject lv_eachExpression_11_0 = null;
  
  
  
          	enterRule();
  
          try {
              // InternalSARL.g:11177:2: ( ( () otherlv_1= 'FOR' ( (lv_declaredParam_2_0= ruleJvmFormalParameter ) ) otherlv_3= ':' ( (lv_forExpression_4_0= ruleXExpression ) ) (otherlv_5= 'BEFORE' ( (lv_before_6_0= ruleXExpression ) ) )? (otherlv_7= 'SEPARATOR' ( (lv_separator_8_0= ruleXExpression ) ) )? (otherlv_9= 'AFTER' ( (lv_after_10_0= ruleXExpression ) ) )? ( (lv_eachExpression_11_0= ruleInternalRichString ) ) otherlv_12= 'ENDFOR' ) )
              // InternalSARL.g:11178:2: ( () otherlv_1= 'FOR' ( (lv_declaredParam_2_0= ruleJvmFormalParameter ) ) otherlv_3= ':' ( (lv_forExpression_4_0= ruleXExpression ) ) (otherlv_5= 'BEFORE' ( (lv_before_6_0= ruleXExpression ) ) )? (otherlv_7= 'SEPARATOR' ( (lv_separator_8_0= ruleXExpression ) ) )? (otherlv_9= 'AFTER' ( (lv_after_10_0= ruleXExpression ) ) )? ( (lv_eachExpression_11_0= ruleInternalRichString ) ) otherlv_12= 'ENDFOR' )
              {
              // InternalSARL.g:11178:2: ( () otherlv_1= 'FOR' ( (lv_declaredParam_2_0= ruleJvmFormalParameter ) ) otherlv_3= ':' ( (lv_forExpression_4_0= ruleXExpression ) ) (otherlv_5= 'BEFORE' ( (lv_before_6_0= ruleXExpression ) ) )? (otherlv_7= 'SEPARATOR' ( (lv_separator_8_0= ruleXExpression ) ) )? (otherlv_9= 'AFTER' ( (lv_after_10_0= ruleXExpression ) ) )? ( (lv_eachExpression_11_0= ruleInternalRichString ) ) otherlv_12= 'ENDFOR' )
              // InternalSARL.g:11179:3: () otherlv_1= 'FOR' ( (lv_declaredParam_2_0= ruleJvmFormalParameter ) ) otherlv_3= ':' ( (lv_forExpression_4_0= ruleXExpression ) ) (otherlv_5= 'BEFORE' ( (lv_before_6_0= ruleXExpression ) ) )? (otherlv_7= 'SEPARATOR' ( (lv_separator_8_0= ruleXExpression ) ) )? (otherlv_9= 'AFTER' ( (lv_after_10_0= ruleXExpression ) ) )? ( (lv_eachExpression_11_0= ruleInternalRichString ) ) otherlv_12= 'ENDFOR'
              {
              // InternalSARL.g:11179:3: ()
              // InternalSARL.g:11180:4: 
              {
              if ( state.backtracking==0 ) {
  
                				current = forceCreateModelElement(
                					grammarAccess.getRichStringForLoopAccess().getRichStringForLoopAction_0(),
                					current);
                			
              }
  
              }
  
              otherlv_1=(Token)match(input,99,FOLLOW_75); if (state.failed) return current;
              if ( state.backtracking==0 ) {
  
                			newLeafNode(otherlv_1, grammarAccess.getRichStringForLoopAccess().getFORKeyword_1());
                		
              }
              // InternalSARL.g:11190:3: ( (lv_declaredParam_2_0= ruleJvmFormalParameter ) )
              // InternalSARL.g:11191:4: (lv_declaredParam_2_0= ruleJvmFormalParameter )
              {
              // InternalSARL.g:11191:4: (lv_declaredParam_2_0= ruleJvmFormalParameter )
              // InternalSARL.g:11192:5: lv_declaredParam_2_0= ruleJvmFormalParameter
              {
              if ( state.backtracking==0 ) {
  
                					newCompositeNode(grammarAccess.getRichStringForLoopAccess().getDeclaredParamJvmFormalParameterParserRuleCall_2_0());
                				
              }
              pushFollow(FOLLOW_40);
              lv_declaredParam_2_0=ruleJvmFormalParameter();
  
              state._fsp--;
              if (state.failed) return current;
              if ( state.backtracking==0 ) {
  
                					if (current==null) {
                						current = createModelElementForParent(grammarAccess.getRichStringForLoopRule());
                					}
                					set(
                						current,
                						"declaredParam",
                						lv_declaredParam_2_0,
                						"io.sarl.lang.SARL.JvmFormalParameter");
                					afterParserOrEnumRuleCall();
                				
              }
  
              }
  
  
              }
  
              otherlv_3=(Token)match(input,46,FOLLOW_45); if (state.failed) return current;
              if ( state.backtracking==0 ) {
  
                			newLeafNode(otherlv_3, grammarAccess.getRichStringForLoopAccess().getColonKeyword_3());
                		
              }
              // InternalSARL.g:11213:3: ( (lv_forExpression_4_0= ruleXExpression ) )
              // InternalSARL.g:11214:4: (lv_forExpression_4_0= ruleXExpression )
              {
              // InternalSARL.g:11214:4: (lv_forExpression_4_0= ruleXExpression )
              // InternalSARL.g:11215:5: lv_forExpression_4_0= ruleXExpression
              {
              if ( state.backtracking==0 ) {
  
                					newCompositeNode(grammarAccess.getRichStringForLoopAccess().getForExpressionXExpressionParserRuleCall_4_0());
                				
              }
              pushFollow(FOLLOW_104);
              lv_forExpression_4_0=ruleXExpression();
  
              state._fsp--;
              if (state.failed) return current;
              if ( state.backtracking==0 ) {
  
                					if (current==null) {
                						current = createModelElementForParent(grammarAccess.getRichStringForLoopRule());
                					}
                					set(
                						current,
                						"forExpression",
                						lv_forExpression_4_0,
                						"org.eclipse.xtext.xbase.Xbase.XExpression");
                					afterParserOrEnumRuleCall();
                				
              }
  
              }
  
  
              }
  
              // InternalSARL.g:11232:3: (otherlv_5= 'BEFORE' ( (lv_before_6_0= ruleXExpression ) ) )?
              int alt281=2;
              int LA281_0 = input.LA(1);
  
              if ( (LA281_0==94) ) {
                  alt281=1;
              }
              switch (alt281) {
                  case 1 :
                      // InternalSARL.g:11233:4: otherlv_5= 'BEFORE' ( (lv_before_6_0= ruleXExpression ) )
                      {
                      otherlv_5=(Token)match(input,94,FOLLOW_45); if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        				newLeafNode(otherlv_5, grammarAccess.getRichStringForLoopAccess().getBEFOREKeyword_5_0());
                        			
                      }
                      // InternalSARL.g:11237:4: ( (lv_before_6_0= ruleXExpression ) )
                      // InternalSARL.g:11238:5: (lv_before_6_0= ruleXExpression )
                      {
                      // InternalSARL.g:11238:5: (lv_before_6_0= ruleXExpression )
                      // InternalSARL.g:11239:6: lv_before_6_0= ruleXExpression
                      {
                      if ( state.backtracking==0 ) {
  
                        						newCompositeNode(grammarAccess.getRichStringForLoopAccess().getBeforeXExpressionParserRuleCall_5_1_0());
                        					
                      }
                      pushFollow(FOLLOW_104);
                      lv_before_6_0=ruleXExpression();
  
                      state._fsp--;
                      if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        						if (current==null) {
                        							current = createModelElementForParent(grammarAccess.getRichStringForLoopRule());
                        						}
                        						set(
                        							current,
                        							"before",
                        							lv_before_6_0,
                        							"org.eclipse.xtext.xbase.Xbase.XExpression");
                        						afterParserOrEnumRuleCall();
                        					
                      }
  
                      }
  
  
                      }
  
  
                      }
                      break;
  
              }
  
              // InternalSARL.g:11257:3: (otherlv_7= 'SEPARATOR' ( (lv_separator_8_0= ruleXExpression ) ) )?
              int alt282=2;
              int LA282_0 = input.LA(1);
  
              if ( (LA282_0==95) ) {
                  alt282=1;
              }
              switch (alt282) {
                  case 1 :
                      // InternalSARL.g:11258:4: otherlv_7= 'SEPARATOR' ( (lv_separator_8_0= ruleXExpression ) )
                      {
                      otherlv_7=(Token)match(input,95,FOLLOW_45); if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        				newLeafNode(otherlv_7, grammarAccess.getRichStringForLoopAccess().getSEPARATORKeyword_6_0());
                        			
                      }
                      // InternalSARL.g:11262:4: ( (lv_separator_8_0= ruleXExpression ) )
                      // InternalSARL.g:11263:5: (lv_separator_8_0= ruleXExpression )
                      {
                      // InternalSARL.g:11263:5: (lv_separator_8_0= ruleXExpression )
                      // InternalSARL.g:11264:6: lv_separator_8_0= ruleXExpression
                      {
                      if ( state.backtracking==0 ) {
  
                        						newCompositeNode(grammarAccess.getRichStringForLoopAccess().getSeparatorXExpressionParserRuleCall_6_1_0());
                        					
                      }
                      pushFollow(FOLLOW_104);
                      lv_separator_8_0=ruleXExpression();
  
                      state._fsp--;
                      if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        						if (current==null) {
                        							current = createModelElementForParent(grammarAccess.getRichStringForLoopRule());
                        						}
                        						set(
                        							current,
                        							"separator",
                        							lv_separator_8_0,
                        							"org.eclipse.xtext.xbase.Xbase.XExpression");
                        						afterParserOrEnumRuleCall();
                        					
                      }
  
                      }
  
  
                      }
  
  
                      }
                      break;
  
              }
  
              // InternalSARL.g:11282:3: (otherlv_9= 'AFTER' ( (lv_after_10_0= ruleXExpression ) ) )?
              int alt283=2;
              int LA283_0 = input.LA(1);
  
              if ( (LA283_0==93) ) {
                  alt283=1;
              }
              switch (alt283) {
                  case 1 :
                      // InternalSARL.g:11283:4: otherlv_9= 'AFTER' ( (lv_after_10_0= ruleXExpression ) )
                      {
                      otherlv_9=(Token)match(input,93,FOLLOW_45); if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        				newLeafNode(otherlv_9, grammarAccess.getRichStringForLoopAccess().getAFTERKeyword_7_0());
                        			
                      }
                      // InternalSARL.g:11287:4: ( (lv_after_10_0= ruleXExpression ) )
                      // InternalSARL.g:11288:5: (lv_after_10_0= ruleXExpression )
                      {
                      // InternalSARL.g:11288:5: (lv_after_10_0= ruleXExpression )
                      // InternalSARL.g:11289:6: lv_after_10_0= ruleXExpression
                      {
                      if ( state.backtracking==0 ) {
  
                        						newCompositeNode(grammarAccess.getRichStringForLoopAccess().getAfterXExpressionParserRuleCall_7_1_0());
                        					
                      }
                      pushFollow(FOLLOW_104);
                      lv_after_10_0=ruleXExpression();
  
                      state._fsp--;
                      if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        						if (current==null) {
                        							current = createModelElementForParent(grammarAccess.getRichStringForLoopRule());
                        						}
                        						set(
                        							current,
                        							"after",
                        							lv_after_10_0,
                        							"org.eclipse.xtext.xbase.Xbase.XExpression");
                        						afterParserOrEnumRuleCall();
                        					
                      }
  
                      }
  
  
                      }
  
  
                      }
                      break;
  
              }
  
              // InternalSARL.g:11307:3: ( (lv_eachExpression_11_0= ruleInternalRichString ) )
              // InternalSARL.g:11308:4: (lv_eachExpression_11_0= ruleInternalRichString )
              {
              // InternalSARL.g:11308:4: (lv_eachExpression_11_0= ruleInternalRichString )
              // InternalSARL.g:11309:5: lv_eachExpression_11_0= ruleInternalRichString
              {
              if ( state.backtracking==0 ) {
  
                					newCompositeNode(grammarAccess.getRichStringForLoopAccess().getEachExpressionInternalRichStringParserRuleCall_8_0());
                				
              }
              pushFollow(FOLLOW_105);
              lv_eachExpression_11_0=ruleInternalRichString();
  
              state._fsp--;
              if (state.failed) return current;
              if ( state.backtracking==0 ) {
  
                					if (current==null) {
                						current = createModelElementForParent(grammarAccess.getRichStringForLoopRule());
                					}
                					set(
                						current,
                						"eachExpression",
                						lv_eachExpression_11_0,
                						"org.eclipse.xtend.core.Xtend.InternalRichString");
                					afterParserOrEnumRuleCall();
                				
              }
  
              }
  
  
              }
  
              otherlv_12=(Token)match(input,100,FOLLOW_2); if (state.failed) return current;
              if ( state.backtracking==0 ) {
  
                			newLeafNode(otherlv_12, grammarAccess.getRichStringForLoopAccess().getENDFORKeyword_9());
                		
              }
  
              }
  
  
              }
  
              if ( state.backtracking==0 ) {
  
                	leaveRule();
  
              }
          }
  
              catch (RecognitionException re) {
                  recover(input,re);
                  appendSkippedTokens();
              }
          finally {
          }
          return current;
      }