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;
    }
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 { { { loop74 : do { int alt74 = 2 ; int LA74_0 = input . LA ( 1 ) ; if ( ( LA74_0 == 21 ) ) { alt74 = 1 ; } switch ( alt74 ) { case 1 : { { 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 ( ) ) ; { { 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 ( ) ; } } int alt75 = 2 ; int LA75_0 = input . LA ( 1 ) ; if ( ( LA75_0 == 24 ) ) { alt75 = 1 ; } switch ( alt75 ) { case 1 : { otherlv_3 = ( Token ) match ( input , 24 , FollowSets000 . FOLLOW_13 ) ; newLeafNode ( otherlv_3 , grammarAccess . getEnumRuleAccess ( ) . getReturnsKeyword_3_0 ( ) ) ; { { 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 ( ) ) ; { { 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 ; }
InternalXtext.g:3533:1: ruleEnumRule returns [EObject current=null] : ( ( (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= ';' ) ;