docs: public final EObject ruleAbstractRule() throws RecognitionException {
          EObject current = null;
  
          EObject this_ParserRule_0 = null;
  
          EObject this_TerminalRule_1 = null;
  
          EObject this_EnumRule_2 = null;
  
  
  
          	enterRule();
  
          try {
              // InternalXtext.g:311:2: ( (this_ParserRule_0= ruleParserRule | this_TerminalRule_1= ruleTerminalRule | this_EnumRule_2= ruleEnumRule ) )
              // InternalXtext.g:312:2: (this_ParserRule_0= ruleParserRule | this_TerminalRule_1= ruleTerminalRule | this_EnumRule_2= ruleEnumRule )
              {
              // InternalXtext.g:312:2: (this_ParserRule_0= ruleParserRule | this_TerminalRule_1= ruleTerminalRule | this_EnumRule_2= ruleEnumRule )
              int alt9=3;
              alt9 = dfa9.predict(input);
              switch (alt9) {
                  case 1 :
                      // InternalXtext.g:313:3: this_ParserRule_0= ruleParserRule
                      {
  
                      			newCompositeNode(grammarAccess.getAbstractRuleAccess().getParserRuleParserRuleCall_0());
                      		
                      pushFollow(FollowSets000.FOLLOW_2);
                      this_ParserRule_0=ruleParserRule();
  
                      state._fsp--;
  
  
                      			current = this_ParserRule_0;
                      			afterParserOrEnumRuleCall();
                      		
  
                      }
                      break;
                  case 2 :
                      // InternalXtext.g:322:3: this_TerminalRule_1= ruleTerminalRule
                      {
  
                      			newCompositeNode(grammarAccess.getAbstractRuleAccess().getTerminalRuleParserRuleCall_1());
                      		
                      pushFollow(FollowSets000.FOLLOW_2);
                      this_TerminalRule_1=ruleTerminalRule();
  
                      state._fsp--;
  
  
                      			current = this_TerminalRule_1;
                      			afterParserOrEnumRuleCall();
                      		
  
                      }
                      break;
                  case 3 :
                      // InternalXtext.g:331:3: this_EnumRule_2= ruleEnumRule
                      {
  
                      			newCompositeNode(grammarAccess.getAbstractRuleAccess().getEnumRuleParserRuleCall_2());
                      		
                      pushFollow(FollowSets000.FOLLOW_2);
                      this_EnumRule_2=ruleEnumRule();
  
                      state._fsp--;
  
  
                      			current = this_EnumRule_2;
                      			afterParserOrEnumRuleCall();
                      		
  
                      }
                      break;
  
              }
  
  
              }
  
  
              	leaveRule();
  
          }
  
              catch (RecognitionException re) {
                  recover(input,re);
                  appendSkippedTokens();
              }
          finally {
          }
          return current;
      }