docs: public final EObject ruleXFeatureCall() throws RecognitionException {
          EObject current = null;
  
          Token otherlv_1=null;
          Token otherlv_3=null;
          Token otherlv_5=null;
          Token lv_explicitOperationCall_7_0=null;
          Token otherlv_10=null;
          Token otherlv_12=null;
          EObject lv_typeArguments_2_0 = null;
  
          EObject lv_typeArguments_4_0 = null;
  
          EObject lv_featureCallArguments_8_0 = null;
  
          EObject lv_featureCallArguments_9_0 = null;
  
          EObject lv_featureCallArguments_11_0 = null;
  
          EObject lv_featureCallArguments_13_0 = null;
  
  
  
          	enterRule();
  
          try {
              // InternalSARL.g:14900:2: ( ( () (otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')' )? ( ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure ) )? ) )
              // InternalSARL.g:14901:2: ( () (otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')' )? ( ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure ) )? )
              {
              // InternalSARL.g:14901:2: ( () (otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')' )? ( ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure ) )? )
              // InternalSARL.g:14902:3: () (otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')' )? ( ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure ) )?
              {
              // InternalSARL.g:14902:3: ()
              // InternalSARL.g:14903:4: 
              {
              if ( state.backtracking==0 ) {
  
                				current = forceCreateModelElement(
                					grammarAccess.getXFeatureCallAccess().getXFeatureCallAction_0(),
                					current);
                			
              }
  
              }
  
              // InternalSARL.g:14909:3: (otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' )?
              int alt348=2;
              int LA348_0 = input.LA(1);
  
              if ( (LA348_0==40) ) {
                  alt348=1;
              }
              switch (alt348) {
                  case 1 :
                      // InternalSARL.g:14910:4: otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>'
                      {
                      otherlv_1=(Token)match(input,40,FOLLOW_92); if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        				newLeafNode(otherlv_1, grammarAccess.getXFeatureCallAccess().getLessThanSignKeyword_1_0());
                        			
                      }
                      // InternalSARL.g:14914:4: ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) )
                      // InternalSARL.g:14915:5: (lv_typeArguments_2_0= ruleJvmArgumentTypeReference )
                      {
                      // InternalSARL.g:14915:5: (lv_typeArguments_2_0= ruleJvmArgumentTypeReference )
                      // InternalSARL.g:14916:6: lv_typeArguments_2_0= ruleJvmArgumentTypeReference
                      {
                      if ( state.backtracking==0 ) {
  
                        						newCompositeNode(grammarAccess.getXFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_0());
                        					
                      }
                      pushFollow(FOLLOW_28);
                      lv_typeArguments_2_0=ruleJvmArgumentTypeReference();
  
                      state._fsp--;
                      if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        						if (current==null) {
                        							current = createModelElementForParent(grammarAccess.getXFeatureCallRule());
                        						}
                        						add(
                        							current,
                        							"typeArguments",
                        							lv_typeArguments_2_0,
                        							"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
                        						afterParserOrEnumRuleCall();
                        					
                      }
  
                      }
  
  
                      }
  
                      // InternalSARL.g:14933:4: (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )*
                      loop347:
                      do {
                          int alt347=2;
                          int LA347_0 = input.LA(1);
  
                          if ( (LA347_0==32) ) {
                              alt347=1;
                          }
  
  
                          switch (alt347) {
                      	case 1 :
                      	    // InternalSARL.g:14934:5: otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) )
                      	    {
                      	    otherlv_3=(Token)match(input,32,FOLLOW_92); if (state.failed) return current;
                      	    if ( state.backtracking==0 ) {
  
                      	      					newLeafNode(otherlv_3, grammarAccess.getXFeatureCallAccess().getCommaKeyword_1_2_0());
                      	      				
                      	    }
                      	    // InternalSARL.g:14938:5: ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) )
                      	    // InternalSARL.g:14939:6: (lv_typeArguments_4_0= ruleJvmArgumentTypeReference )
                      	    {
                      	    // InternalSARL.g:14939:6: (lv_typeArguments_4_0= ruleJvmArgumentTypeReference )
                      	    // InternalSARL.g:14940:7: lv_typeArguments_4_0= ruleJvmArgumentTypeReference
                      	    {
                      	    if ( state.backtracking==0 ) {
  
                      	      							newCompositeNode(grammarAccess.getXFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_2_1_0());
                      	      						
                      	    }
                      	    pushFollow(FOLLOW_28);
                      	    lv_typeArguments_4_0=ruleJvmArgumentTypeReference();
  
                      	    state._fsp--;
                      	    if (state.failed) return current;
                      	    if ( state.backtracking==0 ) {
  
                      	      							if (current==null) {
                      	      								current = createModelElementForParent(grammarAccess.getXFeatureCallRule());
                      	      							}
                      	      							add(
                      	      								current,
                      	      								"typeArguments",
                      	      								lv_typeArguments_4_0,
                      	      								"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
                      	      							afterParserOrEnumRuleCall();
                      	      						
                      	    }
  
                      	    }
  
  
                      	    }
  
  
                      	    }
                      	    break;
  
                      	default :
                      	    break loop347;
                          }
                      } while (true);
  
                      otherlv_5=(Token)match(input,41,FOLLOW_127); if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        				newLeafNode(otherlv_5, grammarAccess.getXFeatureCallAccess().getGreaterThanSignKeyword_1_3());
                        			
                      }
  
                      }
                      break;
  
              }
  
              // InternalSARL.g:14963:3: ( ( ruleIdOrSuper ) )
              // InternalSARL.g:14964:4: ( ruleIdOrSuper )
              {
              // InternalSARL.g:14964:4: ( ruleIdOrSuper )
              // InternalSARL.g:14965:5: ruleIdOrSuper
              {
              if ( state.backtracking==0 ) {
  
                					if (current==null) {
                						current = createModelElement(grammarAccess.getXFeatureCallRule());
                					}
                				
              }
              if ( state.backtracking==0 ) {
  
                					newCompositeNode(grammarAccess.getXFeatureCallAccess().getFeatureJvmIdentifiableElementCrossReference_2_0());
                				
              }
              pushFollow(FOLLOW_96);
              ruleIdOrSuper();
  
              state._fsp--;
              if (state.failed) return current;
              if ( state.backtracking==0 ) {
  
                					afterParserOrEnumRuleCall();
                				
              }
  
              }
  
  
              }
  
              // InternalSARL.g:14979:3: ( ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')' )?
              int alt351=2;
              alt351 = dfa351.predict(input);
              switch (alt351) {
                  case 1 :
                      // InternalSARL.g:14980:4: ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')'
                      {
                      // InternalSARL.g:14980:4: ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) )
                      // InternalSARL.g:14981:5: ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' )
                      {
                      // InternalSARL.g:14985:5: (lv_explicitOperationCall_7_0= '(' )
                      // InternalSARL.g:14986:6: lv_explicitOperationCall_7_0= '('
                      {
                      lv_explicitOperationCall_7_0=(Token)match(input,49,FOLLOW_97); if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        						newLeafNode(lv_explicitOperationCall_7_0, grammarAccess.getXFeatureCallAccess().getExplicitOperationCallLeftParenthesisKeyword_3_0_0());
                        					
                      }
                      if ( state.backtracking==0 ) {
  
                        						if (current==null) {
                        							current = createModelElement(grammarAccess.getXFeatureCallRule());
                        						}
                        						setWithLastConsumed(current, "explicitOperationCall", true, "(");
                        					
                      }
  
                      }
  
  
                      }
  
                      // InternalSARL.g:14998:4: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )?
                      int alt350=3;
                      alt350 = dfa350.predict(input);
                      switch (alt350) {
                          case 1 :
                              // InternalSARL.g:14999:5: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) )
                              {
                              // InternalSARL.g:14999:5: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) )
                              // InternalSARL.g:15000:6: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure )
                              {
                              // InternalSARL.g:15025:6: (lv_featureCallArguments_8_0= ruleXShortClosure )
                              // InternalSARL.g:15026:7: lv_featureCallArguments_8_0= ruleXShortClosure
                              {
                              if ( state.backtracking==0 ) {
  
                                							newCompositeNode(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXShortClosureParserRuleCall_3_1_0_0());
                                						
                              }
                              pushFollow(FOLLOW_81);
                              lv_featureCallArguments_8_0=ruleXShortClosure();
  
                              state._fsp--;
                              if (state.failed) return current;
                              if ( state.backtracking==0 ) {
  
                                							if (current==null) {
                                								current = createModelElementForParent(grammarAccess.getXFeatureCallRule());
                                							}
                                							add(
                                								current,
                                								"featureCallArguments",
                                								lv_featureCallArguments_8_0,
                                								"org.eclipse.xtext.xbase.Xbase.XShortClosure");
                                							afterParserOrEnumRuleCall();
                                						
                              }
  
                              }
  
  
                              }
  
  
                              }
                              break;
                          case 2 :
                              // InternalSARL.g:15044:5: ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* )
                              {
                              // InternalSARL.g:15044:5: ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* )
                              // InternalSARL.g:15045:6: ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )*
                              {
                              // InternalSARL.g:15045:6: ( (lv_featureCallArguments_9_0= ruleXExpression ) )
                              // InternalSARL.g:15046:7: (lv_featureCallArguments_9_0= ruleXExpression )
                              {
                              // InternalSARL.g:15046:7: (lv_featureCallArguments_9_0= ruleXExpression )
                              // InternalSARL.g:15047:8: lv_featureCallArguments_9_0= ruleXExpression
                              {
                              if ( state.backtracking==0 ) {
  
                                								newCompositeNode(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXExpressionParserRuleCall_3_1_1_0_0());
                                							
                              }
                              pushFollow(FOLLOW_51);
                              lv_featureCallArguments_9_0=ruleXExpression();
  
                              state._fsp--;
                              if (state.failed) return current;
                              if ( state.backtracking==0 ) {
  
                                								if (current==null) {
                                									current = createModelElementForParent(grammarAccess.getXFeatureCallRule());
                                								}
                                								add(
                                									current,
                                									"featureCallArguments",
                                									lv_featureCallArguments_9_0,
                                									"org.eclipse.xtext.xbase.Xbase.XExpression");
                                								afterParserOrEnumRuleCall();
                                							
                              }
  
                              }
  
  
                              }
  
                              // InternalSARL.g:15064:6: (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )*
                              loop349:
                              do {
                                  int alt349=2;
                                  int LA349_0 = input.LA(1);
  
                                  if ( (LA349_0==32) ) {
                                      alt349=1;
                                  }
  
  
                                  switch (alt349) {
                              	case 1 :
                              	    // InternalSARL.g:15065:7: otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) )
                              	    {
                              	    otherlv_10=(Token)match(input,32,FOLLOW_45); if (state.failed) return current;
                              	    if ( state.backtracking==0 ) {
  
                              	      							newLeafNode(otherlv_10, grammarAccess.getXFeatureCallAccess().getCommaKeyword_3_1_1_1_0());
                              	      						
                              	    }
                              	    // InternalSARL.g:15069:7: ( (lv_featureCallArguments_11_0= ruleXExpression ) )
                              	    // InternalSARL.g:15070:8: (lv_featureCallArguments_11_0= ruleXExpression )
                              	    {
                              	    // InternalSARL.g:15070:8: (lv_featureCallArguments_11_0= ruleXExpression )
                              	    // InternalSARL.g:15071:9: lv_featureCallArguments_11_0= ruleXExpression
                              	    {
                              	    if ( state.backtracking==0 ) {
  
                              	      									newCompositeNode(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXExpressionParserRuleCall_3_1_1_1_1_0());
                              	      								
                              	    }
                              	    pushFollow(FOLLOW_51);
                              	    lv_featureCallArguments_11_0=ruleXExpression();
  
                              	    state._fsp--;
                              	    if (state.failed) return current;
                              	    if ( state.backtracking==0 ) {
  
                              	      									if (current==null) {
                              	      										current = createModelElementForParent(grammarAccess.getXFeatureCallRule());
                              	      									}
                              	      									add(
                              	      										current,
                              	      										"featureCallArguments",
                              	      										lv_featureCallArguments_11_0,
                              	      										"org.eclipse.xtext.xbase.Xbase.XExpression");
                              	      									afterParserOrEnumRuleCall();
                              	      								
                              	    }
  
                              	    }
  
  
                              	    }
  
  
                              	    }
                              	    break;
  
                              	default :
                              	    break loop349;
                                  }
                              } while (true);
  
  
                              }
  
  
                              }
                              break;
  
                      }
  
                      otherlv_12=(Token)match(input,50,FOLLOW_89); if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        				newLeafNode(otherlv_12, grammarAccess.getXFeatureCallAccess().getRightParenthesisKeyword_3_2());
                        			
                      }
  
                      }
                      break;
  
              }
  
              // InternalSARL.g:15096:3: ( ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure ) )?
              int alt352=2;
              alt352 = dfa352.predict(input);
              switch (alt352) {
                  case 1 :
                      // InternalSARL.g:15097:4: ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure )
                      {
                      // InternalSARL.g:15103:4: (lv_featureCallArguments_13_0= ruleXClosure )
                      // InternalSARL.g:15104:5: lv_featureCallArguments_13_0= ruleXClosure
                      {
                      if ( state.backtracking==0 ) {
  
                        					newCompositeNode(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXClosureParserRuleCall_4_0());
                        				
                      }
                      pushFollow(FOLLOW_2);
                      lv_featureCallArguments_13_0=ruleXClosure();
  
                      state._fsp--;
                      if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        					if (current==null) {
                        						current = createModelElementForParent(grammarAccess.getXFeatureCallRule());
                        					}
                        					add(
                        						current,
                        						"featureCallArguments",
                        						lv_featureCallArguments_13_0,
                        						"org.eclipse.xtext.xbase.Xbase.XClosure");
                        					afterParserOrEnumRuleCall();
                        				
                      }
  
                      }
  
  
                      }
                      break;
  
              }
  
  
              }
  
  
              }
  
              if ( state.backtracking==0 ) {
  
                	leaveRule();
  
              }
          }
  
              catch (RecognitionException re) {
                  recover(input,re);
                  appendSkippedTokens();
              }
          finally {
          }
          return current;
      }