docs: public final EObject ruleEnumRule() throws RecognitionException {
          EObject current = null;
  
          Token otherlv_1=null;
          Token otherlv_3=null;
          Token otherlv_5=null;
          Token otherlv_7=null;
          EObject lv_annotations_0_0 = null;
  
          AntlrDatatypeRuleToken lv_name_2_0 = null;
  
          EObject lv_type_4_0 = null;
  
          EObject lv_alternatives_6_0 = null;
  
  
  
          	enterRule();
  
          try {
              // InternalXtext.g:3539:2: ( ( ( (lv_annotations_0_0= ruleAnnotation ) )* otherlv_1= 'enum' ( (lv_name_2_0= ruleValidID ) ) (otherlv_3= 'returns' ( (lv_type_4_0= ruleTypeRef ) ) )? otherlv_5= ':' ( (lv_alternatives_6_0= ruleEnumLiterals ) ) otherlv_7= ';' ) )
              // InternalXtext.g:3540:2: ( ( (lv_annotations_0_0= ruleAnnotation ) )* otherlv_1= 'enum' ( (lv_name_2_0= ruleValidID ) ) (otherlv_3= 'returns' ( (lv_type_4_0= ruleTypeRef ) ) )? otherlv_5= ':' ( (lv_alternatives_6_0= ruleEnumLiterals ) ) otherlv_7= ';' )
              {
              // InternalXtext.g:3540:2: ( ( (lv_annotations_0_0= ruleAnnotation ) )* otherlv_1= 'enum' ( (lv_name_2_0= ruleValidID ) ) (otherlv_3= 'returns' ( (lv_type_4_0= ruleTypeRef ) ) )? otherlv_5= ':' ( (lv_alternatives_6_0= ruleEnumLiterals ) ) otherlv_7= ';' )
              // InternalXtext.g:3541:3: ( (lv_annotations_0_0= ruleAnnotation ) )* otherlv_1= 'enum' ( (lv_name_2_0= ruleValidID ) ) (otherlv_3= 'returns' ( (lv_type_4_0= ruleTypeRef ) ) )? otherlv_5= ':' ( (lv_alternatives_6_0= ruleEnumLiterals ) ) otherlv_7= ';'
              {
              // InternalXtext.g:3541:3: ( (lv_annotations_0_0= ruleAnnotation ) )*
              loop74:
              do {
                  int alt74=2;
                  int LA74_0 = input.LA(1);
  
                  if ( (LA74_0==21) ) {
                      alt74=1;
                  }
  
  
                  switch (alt74) {
              	case 1 :
              	    // InternalXtext.g:3542:4: (lv_annotations_0_0= ruleAnnotation )
              	    {
              	    // InternalXtext.g:3542:4: (lv_annotations_0_0= ruleAnnotation )
              	    // InternalXtext.g:3543:5: lv_annotations_0_0= ruleAnnotation
              	    {
  
              	    					newCompositeNode(grammarAccess.getEnumRuleAccess().getAnnotationsAnnotationParserRuleCall_0_0());
              	    				
              	    pushFollow(FollowSets000.FOLLOW_50);
              	    lv_annotations_0_0=ruleAnnotation();
  
              	    state._fsp--;
  
  
              	    					if (current==null) {
              	    						current = createModelElementForParent(grammarAccess.getEnumRuleRule());
              	    					}
              	    					add(
              	    						current,
              	    						"annotations",
              	    						lv_annotations_0_0,
              	    						"org.eclipse.xtext.Xtext.Annotation");
              	    					afterParserOrEnumRuleCall();
              	    				
  
              	    }
  
  
              	    }
              	    break;
  
              	default :
              	    break loop74;
                  }
              } while (true);
  
              otherlv_1=(Token)match(input,50,FollowSets000.FOLLOW_3); 
  
              			newLeafNode(otherlv_1, grammarAccess.getEnumRuleAccess().getEnumKeyword_1());
              		
              // InternalXtext.g:3564:3: ( (lv_name_2_0= ruleValidID ) )
              // InternalXtext.g:3565:4: (lv_name_2_0= ruleValidID )
              {
              // InternalXtext.g:3565:4: (lv_name_2_0= ruleValidID )
              // InternalXtext.g:3566:5: lv_name_2_0= ruleValidID
              {
  
              					newCompositeNode(grammarAccess.getEnumRuleAccess().getNameValidIDParserRuleCall_2_0());
              				
              pushFollow(FollowSets000.FOLLOW_46);
              lv_name_2_0=ruleValidID();
  
              state._fsp--;
  
  
              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getEnumRuleRule());
              					}
              					set(
              						current,
              						"name",
              						lv_name_2_0,
              						"org.eclipse.xtext.Xtext.ValidID");
              					afterParserOrEnumRuleCall();
              				
  
              }
  
  
              }
  
              // InternalXtext.g:3583:3: (otherlv_3= 'returns' ( (lv_type_4_0= ruleTypeRef ) ) )?
              int alt75=2;
              int LA75_0 = input.LA(1);
  
              if ( (LA75_0==24) ) {
                  alt75=1;
              }
              switch (alt75) {
                  case 1 :
                      // InternalXtext.g:3584:4: otherlv_3= 'returns' ( (lv_type_4_0= ruleTypeRef ) )
                      {
                      otherlv_3=(Token)match(input,24,FollowSets000.FOLLOW_13); 
  
                      				newLeafNode(otherlv_3, grammarAccess.getEnumRuleAccess().getReturnsKeyword_3_0());
                      			
                      // InternalXtext.g:3588:4: ( (lv_type_4_0= ruleTypeRef ) )
                      // InternalXtext.g:3589:5: (lv_type_4_0= ruleTypeRef )
                      {
                      // InternalXtext.g:3589:5: (lv_type_4_0= ruleTypeRef )
                      // InternalXtext.g:3590:6: lv_type_4_0= ruleTypeRef
                      {
  
                      						newCompositeNode(grammarAccess.getEnumRuleAccess().getTypeTypeRefParserRuleCall_3_1_0());
                      					
                      pushFollow(FollowSets000.FOLLOW_18);
                      lv_type_4_0=ruleTypeRef();
  
                      state._fsp--;
  
  
                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getEnumRuleRule());
                      						}
                      						set(
                      							current,
                      							"type",
                      							lv_type_4_0,
                      							"org.eclipse.xtext.Xtext.TypeRef");
                      						afterParserOrEnumRuleCall();
                      					
  
                      }
  
  
                      }
  
  
                      }
                      break;
  
              }
  
              otherlv_5=(Token)match(input,25,FollowSets000.FOLLOW_13); 
  
              			newLeafNode(otherlv_5, grammarAccess.getEnumRuleAccess().getColonKeyword_4());
              		
              // InternalXtext.g:3612:3: ( (lv_alternatives_6_0= ruleEnumLiterals ) )
              // InternalXtext.g:3613:4: (lv_alternatives_6_0= ruleEnumLiterals )
              {
              // InternalXtext.g:3613:4: (lv_alternatives_6_0= ruleEnumLiterals )
              // InternalXtext.g:3614:5: lv_alternatives_6_0= ruleEnumLiterals
              {
  
              					newCompositeNode(grammarAccess.getEnumRuleAccess().getAlternativesEnumLiteralsParserRuleCall_5_0());
              				
              pushFollow(FollowSets000.FOLLOW_20);
              lv_alternatives_6_0=ruleEnumLiterals();
  
              state._fsp--;
  
  
              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getEnumRuleRule());
              					}
              					set(
              						current,
              						"alternatives",
              						lv_alternatives_6_0,
              						"org.eclipse.xtext.Xtext.EnumLiterals");
              					afterParserOrEnumRuleCall();
              				
  
              }
  
  
              }
  
              otherlv_7=(Token)match(input,26,FollowSets000.FOLLOW_2); 
  
              			newLeafNode(otherlv_7, grammarAccess.getEnumRuleAccess().getSemicolonKeyword_6());
              		
  
              }
  
  
              }
  
  
              	leaveRule();
  
          }
  
              catch (RecognitionException re) {
                  recover(input,re);
                  appendSkippedTokens();
              }
          finally {
          }
          return current;
      }