docs: public final EObject ruleParserRule() throws RecognitionException {
          EObject current = null;
  
          Token lv_fragment_1_0=null;
          Token lv_wildcard_3_0=null;
          Token otherlv_4=null;
          Token otherlv_7=null;
          Token lv_definesHiddenTokens_9_0=null;
          Token otherlv_10=null;
          Token otherlv_12=null;
          Token otherlv_14=null;
          Token otherlv_15=null;
          Token otherlv_17=null;
          EObject lv_annotations_0_0 = null;
  
          EObject this_RuleNameAndParams_2 = null;
  
          EObject lv_type_5_0 = null;
  
          EObject this_RuleNameAndParams_6 = null;
  
          EObject lv_type_8_0 = null;
  
          EObject lv_alternatives_16_0 = null;
  
  
  
          	enterRule();
  
          try {
              // InternalXtext.g:574:2: ( ( ( (lv_annotations_0_0= ruleAnnotation ) )* ( ( ( (lv_fragment_1_0= 'fragment' ) ) this_RuleNameAndParams_2= ruleRuleNameAndParams[$current] ( ( (lv_wildcard_3_0= '*' ) ) | (otherlv_4= 'returns' ( (lv_type_5_0= ruleTypeRef ) ) )? ) ) | (this_RuleNameAndParams_6= ruleRuleNameAndParams[$current] (otherlv_7= 'returns' ( (lv_type_8_0= ruleTypeRef ) ) )? ) ) ( ( (lv_definesHiddenTokens_9_0= 'hidden' ) ) otherlv_10= '(' ( ( ( ruleRuleID ) ) (otherlv_12= ',' ( ( ruleRuleID ) ) )* )? otherlv_14= ')' )? otherlv_15= ':' ( (lv_alternatives_16_0= ruleAlternatives ) ) otherlv_17= ';' ) )
              // InternalXtext.g:575:2: ( ( (lv_annotations_0_0= ruleAnnotation ) )* ( ( ( (lv_fragment_1_0= 'fragment' ) ) this_RuleNameAndParams_2= ruleRuleNameAndParams[$current] ( ( (lv_wildcard_3_0= '*' ) ) | (otherlv_4= 'returns' ( (lv_type_5_0= ruleTypeRef ) ) )? ) ) | (this_RuleNameAndParams_6= ruleRuleNameAndParams[$current] (otherlv_7= 'returns' ( (lv_type_8_0= ruleTypeRef ) ) )? ) ) ( ( (lv_definesHiddenTokens_9_0= 'hidden' ) ) otherlv_10= '(' ( ( ( ruleRuleID ) ) (otherlv_12= ',' ( ( ruleRuleID ) ) )* )? otherlv_14= ')' )? otherlv_15= ':' ( (lv_alternatives_16_0= ruleAlternatives ) ) otherlv_17= ';' )
              {
              // InternalXtext.g:575:2: ( ( (lv_annotations_0_0= ruleAnnotation ) )* ( ( ( (lv_fragment_1_0= 'fragment' ) ) this_RuleNameAndParams_2= ruleRuleNameAndParams[$current] ( ( (lv_wildcard_3_0= '*' ) ) | (otherlv_4= 'returns' ( (lv_type_5_0= ruleTypeRef ) ) )? ) ) | (this_RuleNameAndParams_6= ruleRuleNameAndParams[$current] (otherlv_7= 'returns' ( (lv_type_8_0= ruleTypeRef ) ) )? ) ) ( ( (lv_definesHiddenTokens_9_0= 'hidden' ) ) otherlv_10= '(' ( ( ( ruleRuleID ) ) (otherlv_12= ',' ( ( ruleRuleID ) ) )* )? otherlv_14= ')' )? otherlv_15= ':' ( (lv_alternatives_16_0= ruleAlternatives ) ) otherlv_17= ';' )
              // InternalXtext.g:576:3: ( (lv_annotations_0_0= ruleAnnotation ) )* ( ( ( (lv_fragment_1_0= 'fragment' ) ) this_RuleNameAndParams_2= ruleRuleNameAndParams[$current] ( ( (lv_wildcard_3_0= '*' ) ) | (otherlv_4= 'returns' ( (lv_type_5_0= ruleTypeRef ) ) )? ) ) | (this_RuleNameAndParams_6= ruleRuleNameAndParams[$current] (otherlv_7= 'returns' ( (lv_type_8_0= ruleTypeRef ) ) )? ) ) ( ( (lv_definesHiddenTokens_9_0= 'hidden' ) ) otherlv_10= '(' ( ( ( ruleRuleID ) ) (otherlv_12= ',' ( ( ruleRuleID ) ) )* )? otherlv_14= ')' )? otherlv_15= ':' ( (lv_alternatives_16_0= ruleAlternatives ) ) otherlv_17= ';'
              {
              // InternalXtext.g:576:3: ( (lv_annotations_0_0= ruleAnnotation ) )*
              loop13:
              do {
                  int alt13=2;
                  int LA13_0 = input.LA(1);
  
                  if ( (LA13_0==21) ) {
                      alt13=1;
                  }
  
  
                  switch (alt13) {
              	case 1 :
              	    // InternalXtext.g:577:4: (lv_annotations_0_0= ruleAnnotation )
              	    {
              	    // InternalXtext.g:577:4: (lv_annotations_0_0= ruleAnnotation )
              	    // InternalXtext.g:578:5: lv_annotations_0_0= ruleAnnotation
              	    {
  
              	    					newCompositeNode(grammarAccess.getParserRuleAccess().getAnnotationsAnnotationParserRuleCall_0_0());
              	    				
              	    pushFollow(FollowSets000.FOLLOW_14);
              	    lv_annotations_0_0=ruleAnnotation();
  
              	    state._fsp--;
  
  
              	    					if (current==null) {
              	    						current = createModelElementForParent(grammarAccess.getParserRuleRule());
              	    					}
              	    					add(
              	    						current,
              	    						"annotations",
              	    						lv_annotations_0_0,
              	    						"org.eclipse.xtext.Xtext.Annotation");
              	    					afterParserOrEnumRuleCall();
              	    				
  
              	    }
  
  
              	    }
              	    break;
  
              	default :
              	    break loop13;
                  }
              } while (true);
  
              // InternalXtext.g:595:3: ( ( ( (lv_fragment_1_0= 'fragment' ) ) this_RuleNameAndParams_2= ruleRuleNameAndParams[$current] ( ( (lv_wildcard_3_0= '*' ) ) | (otherlv_4= 'returns' ( (lv_type_5_0= ruleTypeRef ) ) )? ) ) | (this_RuleNameAndParams_6= ruleRuleNameAndParams[$current] (otherlv_7= 'returns' ( (lv_type_8_0= ruleTypeRef ) ) )? ) )
              int alt17=2;
              int LA17_0 = input.LA(1);
  
              if ( (LA17_0==22) ) {
                  alt17=1;
              }
              else if ( (LA17_0==RULE_ID||(LA17_0>=39 && LA17_0<=40)) ) {
                  alt17=2;
              }
              else {
                  NoViableAltException nvae =
                      new NoViableAltException("", 17, 0, input);
  
                  throw nvae;
              }
              switch (alt17) {
                  case 1 :
                      // InternalXtext.g:596:4: ( ( (lv_fragment_1_0= 'fragment' ) ) this_RuleNameAndParams_2= ruleRuleNameAndParams[$current] ( ( (lv_wildcard_3_0= '*' ) ) | (otherlv_4= 'returns' ( (lv_type_5_0= ruleTypeRef ) ) )? ) )
                      {
                      // InternalXtext.g:596:4: ( ( (lv_fragment_1_0= 'fragment' ) ) this_RuleNameAndParams_2= ruleRuleNameAndParams[$current] ( ( (lv_wildcard_3_0= '*' ) ) | (otherlv_4= 'returns' ( (lv_type_5_0= ruleTypeRef ) ) )? ) )
                      // InternalXtext.g:597:5: ( (lv_fragment_1_0= 'fragment' ) ) this_RuleNameAndParams_2= ruleRuleNameAndParams[$current] ( ( (lv_wildcard_3_0= '*' ) ) | (otherlv_4= 'returns' ( (lv_type_5_0= ruleTypeRef ) ) )? )
                      {
                      // InternalXtext.g:597:5: ( (lv_fragment_1_0= 'fragment' ) )
                      // InternalXtext.g:598:6: (lv_fragment_1_0= 'fragment' )
                      {
                      // InternalXtext.g:598:6: (lv_fragment_1_0= 'fragment' )
                      // InternalXtext.g:599:7: lv_fragment_1_0= 'fragment'
                      {
                      lv_fragment_1_0=(Token)match(input,22,FollowSets000.FOLLOW_14); 
  
                      							newLeafNode(lv_fragment_1_0, grammarAccess.getParserRuleAccess().getFragmentFragmentKeyword_1_0_0_0());
                      						
  
                      							if (current==null) {
                      								current = createModelElement(grammarAccess.getParserRuleRule());
                      							}
                      							setWithLastConsumed(current, "fragment", true, "fragment");
                      						
  
                      }
  
  
                      }
  
  
                      					if (current==null) {
                      						current = createModelElement(grammarAccess.getParserRuleRule());
                      					}
                      					newCompositeNode(grammarAccess.getParserRuleAccess().getRuleNameAndParamsParserRuleCall_1_0_1());
                      				
                      pushFollow(FollowSets000.FOLLOW_15);
                      this_RuleNameAndParams_2=ruleRuleNameAndParams(current);
  
                      state._fsp--;
  
  
                      					current = this_RuleNameAndParams_2;
                      					afterParserOrEnumRuleCall();
                      				
                      // InternalXtext.g:622:5: ( ( (lv_wildcard_3_0= '*' ) ) | (otherlv_4= 'returns' ( (lv_type_5_0= ruleTypeRef ) ) )? )
                      int alt15=2;
                      int LA15_0 = input.LA(1);
  
                      if ( (LA15_0==23) ) {
                          alt15=1;
                      }
                      else if ( (LA15_0==14||(LA15_0>=24 && LA15_0<=25)) ) {
                          alt15=2;
                      }
                      else {
                          NoViableAltException nvae =
                              new NoViableAltException("", 15, 0, input);
  
                          throw nvae;
                      }
                      switch (alt15) {
                          case 1 :
                              // InternalXtext.g:623:6: ( (lv_wildcard_3_0= '*' ) )
                              {
                              // InternalXtext.g:623:6: ( (lv_wildcard_3_0= '*' ) )
                              // InternalXtext.g:624:7: (lv_wildcard_3_0= '*' )
                              {
                              // InternalXtext.g:624:7: (lv_wildcard_3_0= '*' )
                              // InternalXtext.g:625:8: lv_wildcard_3_0= '*'
                              {
                              lv_wildcard_3_0=(Token)match(input,23,FollowSets000.FOLLOW_16); 
  
                              								newLeafNode(lv_wildcard_3_0, grammarAccess.getParserRuleAccess().getWildcardAsteriskKeyword_1_0_2_0_0());
                              							
  
                              								if (current==null) {
                              									current = createModelElement(grammarAccess.getParserRuleRule());
                              								}
                              								setWithLastConsumed(current, "wildcard", true, "*");
                              							
  
                              }
  
  
                              }
  
  
                              }
                              break;
                          case 2 :
                              // InternalXtext.g:638:6: (otherlv_4= 'returns' ( (lv_type_5_0= ruleTypeRef ) ) )?
                              {
                              // InternalXtext.g:638:6: (otherlv_4= 'returns' ( (lv_type_5_0= ruleTypeRef ) ) )?
                              int alt14=2;
                              int LA14_0 = input.LA(1);
  
                              if ( (LA14_0==24) ) {
                                  alt14=1;
                              }
                              switch (alt14) {
                                  case 1 :
                                      // InternalXtext.g:639:7: otherlv_4= 'returns' ( (lv_type_5_0= ruleTypeRef ) )
                                      {
                                      otherlv_4=(Token)match(input,24,FollowSets000.FOLLOW_13); 
  
                                      							newLeafNode(otherlv_4, grammarAccess.getParserRuleAccess().getReturnsKeyword_1_0_2_1_0());
                                      						
                                      // InternalXtext.g:643:7: ( (lv_type_5_0= ruleTypeRef ) )
                                      // InternalXtext.g:644:8: (lv_type_5_0= ruleTypeRef )
                                      {
                                      // InternalXtext.g:644:8: (lv_type_5_0= ruleTypeRef )
                                      // InternalXtext.g:645:9: lv_type_5_0= ruleTypeRef
                                      {
  
                                      									newCompositeNode(grammarAccess.getParserRuleAccess().getTypeTypeRefParserRuleCall_1_0_2_1_1_0());
                                      								
                                      pushFollow(FollowSets000.FOLLOW_16);
                                      lv_type_5_0=ruleTypeRef();
  
                                      state._fsp--;
  
  
                                      									if (current==null) {
                                      										current = createModelElementForParent(grammarAccess.getParserRuleRule());
                                      									}
                                      									set(
                                      										current,
                                      										"type",
                                      										lv_type_5_0,
                                      										"org.eclipse.xtext.Xtext.TypeRef");
                                      									afterParserOrEnumRuleCall();
                                      								
  
                                      }
  
  
                                      }
  
  
                                      }
                                      break;
  
                              }
  
  
                              }
                              break;
  
                      }
  
  
                      }
  
  
                      }
                      break;
                  case 2 :
                      // InternalXtext.g:666:4: (this_RuleNameAndParams_6= ruleRuleNameAndParams[$current] (otherlv_7= 'returns' ( (lv_type_8_0= ruleTypeRef ) ) )? )
                      {
                      // InternalXtext.g:666:4: (this_RuleNameAndParams_6= ruleRuleNameAndParams[$current] (otherlv_7= 'returns' ( (lv_type_8_0= ruleTypeRef ) ) )? )
                      // InternalXtext.g:667:5: this_RuleNameAndParams_6= ruleRuleNameAndParams[$current] (otherlv_7= 'returns' ( (lv_type_8_0= ruleTypeRef ) ) )?
                      {
  
                      					if (current==null) {
                      						current = createModelElement(grammarAccess.getParserRuleRule());
                      					}
                      					newCompositeNode(grammarAccess.getParserRuleAccess().getRuleNameAndParamsParserRuleCall_1_1_0());
                      				
                      pushFollow(FollowSets000.FOLLOW_17);
                      this_RuleNameAndParams_6=ruleRuleNameAndParams(current);
  
                      state._fsp--;
  
  
                      					current = this_RuleNameAndParams_6;
                      					afterParserOrEnumRuleCall();
                      				
                      // InternalXtext.g:678:5: (otherlv_7= 'returns' ( (lv_type_8_0= ruleTypeRef ) ) )?
                      int alt16=2;
                      int LA16_0 = input.LA(1);
  
                      if ( (LA16_0==24) ) {
                          alt16=1;
                      }
                      switch (alt16) {
                          case 1 :
                              // InternalXtext.g:679:6: otherlv_7= 'returns' ( (lv_type_8_0= ruleTypeRef ) )
                              {
                              otherlv_7=(Token)match(input,24,FollowSets000.FOLLOW_13); 
  
                              						newLeafNode(otherlv_7, grammarAccess.getParserRuleAccess().getReturnsKeyword_1_1_1_0());
                              					
                              // InternalXtext.g:683:6: ( (lv_type_8_0= ruleTypeRef ) )
                              // InternalXtext.g:684:7: (lv_type_8_0= ruleTypeRef )
                              {
                              // InternalXtext.g:684:7: (lv_type_8_0= ruleTypeRef )
                              // InternalXtext.g:685:8: lv_type_8_0= ruleTypeRef
                              {
  
                              								newCompositeNode(grammarAccess.getParserRuleAccess().getTypeTypeRefParserRuleCall_1_1_1_1_0());
                              							
                              pushFollow(FollowSets000.FOLLOW_16);
                              lv_type_8_0=ruleTypeRef();
  
                              state._fsp--;
  
  
                              								if (current==null) {
                              									current = createModelElementForParent(grammarAccess.getParserRuleRule());
                              								}
                              								set(
                              									current,
                              									"type",
                              									lv_type_8_0,
                              									"org.eclipse.xtext.Xtext.TypeRef");
                              								afterParserOrEnumRuleCall();
                              							
  
                              }
  
  
                              }
  
  
                              }
                              break;
  
                      }
  
  
                      }
  
  
                      }
                      break;
  
              }
  
              // InternalXtext.g:705:3: ( ( (lv_definesHiddenTokens_9_0= 'hidden' ) ) otherlv_10= '(' ( ( ( ruleRuleID ) ) (otherlv_12= ',' ( ( ruleRuleID ) ) )* )? otherlv_14= ')' )?
              int alt20=2;
              int LA20_0 = input.LA(1);
  
              if ( (LA20_0==14) ) {
                  alt20=1;
              }
              switch (alt20) {
                  case 1 :
                      // InternalXtext.g:706:4: ( (lv_definesHiddenTokens_9_0= 'hidden' ) ) otherlv_10= '(' ( ( ( ruleRuleID ) ) (otherlv_12= ',' ( ( ruleRuleID ) ) )* )? otherlv_14= ')'
                      {
                      // InternalXtext.g:706:4: ( (lv_definesHiddenTokens_9_0= 'hidden' ) )
                      // InternalXtext.g:707:5: (lv_definesHiddenTokens_9_0= 'hidden' )
                      {
                      // InternalXtext.g:707:5: (lv_definesHiddenTokens_9_0= 'hidden' )
                      // InternalXtext.g:708:6: lv_definesHiddenTokens_9_0= 'hidden'
                      {
                      lv_definesHiddenTokens_9_0=(Token)match(input,14,FollowSets000.FOLLOW_6); 
  
                      						newLeafNode(lv_definesHiddenTokens_9_0, grammarAccess.getParserRuleAccess().getDefinesHiddenTokensHiddenKeyword_2_0_0());
                      					
  
                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getParserRuleRule());
                      						}
                      						setWithLastConsumed(current, "definesHiddenTokens", true, "hidden");
                      					
  
                      }
  
  
                      }
  
                      otherlv_10=(Token)match(input,15,FollowSets000.FOLLOW_7); 
  
                      				newLeafNode(otherlv_10, grammarAccess.getParserRuleAccess().getLeftParenthesisKeyword_2_1());
                      			
                      // InternalXtext.g:724:4: ( ( ( ruleRuleID ) ) (otherlv_12= ',' ( ( ruleRuleID ) ) )* )?
                      int alt19=2;
                      int LA19_0 = input.LA(1);
  
                      if ( (LA19_0==RULE_ID||(LA19_0>=39 && LA19_0<=40)) ) {
                          alt19=1;
                      }
                      switch (alt19) {
                          case 1 :
                              // InternalXtext.g:725:5: ( ( ruleRuleID ) ) (otherlv_12= ',' ( ( ruleRuleID ) ) )*
                              {
                              // InternalXtext.g:725:5: ( ( ruleRuleID ) )
                              // InternalXtext.g:726:6: ( ruleRuleID )
                              {
                              // InternalXtext.g:726:6: ( ruleRuleID )
                              // InternalXtext.g:727:7: ruleRuleID
                              {
  
                              							if (current==null) {
                              								current = createModelElement(grammarAccess.getParserRuleRule());
                              							}
                              						
  
                              							newCompositeNode(grammarAccess.getParserRuleAccess().getHiddenTokensAbstractRuleCrossReference_2_2_0_0());
                              						
                              pushFollow(FollowSets000.FOLLOW_8);
                              ruleRuleID();
  
                              state._fsp--;
  
  
                              							afterParserOrEnumRuleCall();
                              						
  
                              }
  
  
                              }
  
                              // InternalXtext.g:741:5: (otherlv_12= ',' ( ( ruleRuleID ) ) )*
                              loop18:
                              do {
                                  int alt18=2;
                                  int LA18_0 = input.LA(1);
  
                                  if ( (LA18_0==13) ) {
                                      alt18=1;
                                  }
  
  
                                  switch (alt18) {
                              	case 1 :
                              	    // InternalXtext.g:742:6: otherlv_12= ',' ( ( ruleRuleID ) )
                              	    {
                              	    otherlv_12=(Token)match(input,13,FollowSets000.FOLLOW_3); 
  
                              	    						newLeafNode(otherlv_12, grammarAccess.getParserRuleAccess().getCommaKeyword_2_2_1_0());
                              	    					
                              	    // InternalXtext.g:746:6: ( ( ruleRuleID ) )
                              	    // InternalXtext.g:747:7: ( ruleRuleID )
                              	    {
                              	    // InternalXtext.g:747:7: ( ruleRuleID )
                              	    // InternalXtext.g:748:8: ruleRuleID
                              	    {
  
                              	    								if (current==null) {
                              	    									current = createModelElement(grammarAccess.getParserRuleRule());
                              	    								}
                              	    							
  
                              	    								newCompositeNode(grammarAccess.getParserRuleAccess().getHiddenTokensAbstractRuleCrossReference_2_2_1_1_0());
                              	    							
                              	    pushFollow(FollowSets000.FOLLOW_8);
                              	    ruleRuleID();
  
                              	    state._fsp--;
  
  
                              	    								afterParserOrEnumRuleCall();
                              	    							
  
                              	    }
  
  
                              	    }
  
  
                              	    }
                              	    break;
  
                              	default :
                              	    break loop18;
                                  }
                              } while (true);
  
  
                              }
                              break;
  
                      }
  
                      otherlv_14=(Token)match(input,16,FollowSets000.FOLLOW_18); 
  
                      				newLeafNode(otherlv_14, grammarAccess.getParserRuleAccess().getRightParenthesisKeyword_2_3());
                      			
  
                      }
                      break;
  
              }
  
              otherlv_15=(Token)match(input,25,FollowSets000.FOLLOW_19); 
  
              			newLeafNode(otherlv_15, grammarAccess.getParserRuleAccess().getColonKeyword_3());
              		
              // InternalXtext.g:773:3: ( (lv_alternatives_16_0= ruleAlternatives ) )
              // InternalXtext.g:774:4: (lv_alternatives_16_0= ruleAlternatives )
              {
              // InternalXtext.g:774:4: (lv_alternatives_16_0= ruleAlternatives )
              // InternalXtext.g:775:5: lv_alternatives_16_0= ruleAlternatives
              {
  
              					newCompositeNode(grammarAccess.getParserRuleAccess().getAlternativesAlternativesParserRuleCall_4_0());
              				
              pushFollow(FollowSets000.FOLLOW_20);
              lv_alternatives_16_0=ruleAlternatives();
  
              state._fsp--;
  
  
              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getParserRuleRule());
              					}
              					set(
              						current,
              						"alternatives",
              						lv_alternatives_16_0,
              						"org.eclipse.xtext.Xtext.Alternatives");
              					afterParserOrEnumRuleCall();
              				
  
              }
  
  
              }
  
              otherlv_17=(Token)match(input,26,FollowSets000.FOLLOW_2); 
  
              			newLeafNode(otherlv_17, grammarAccess.getParserRuleAccess().getSemicolonKeyword_5());
              		
  
              }
  
  
              }
  
  
              	leaveRule();
  
          }
  
              catch (RecognitionException re) {
                  recover(input,re);
                  appendSkippedTokens();
              }
          finally {
          }
          return current;
      }