docs: public final EObject ruleAbstractTokenWithCardinality() throws RecognitionException {
          EObject current = null;
  
          Token lv_cardinality_2_1=null;
          Token lv_cardinality_2_2=null;
          Token lv_cardinality_2_3=null;
          EObject this_Assignment_0 = null;
  
          EObject this_AbstractTerminal_1 = null;
  
  
  
          	enterRule();
  
          try {
              // InternalXtext.g:1283:2: ( ( (this_Assignment_0= ruleAssignment | this_AbstractTerminal_1= ruleAbstractTerminal ) ( ( (lv_cardinality_2_1= '?' | lv_cardinality_2_2= '*' | lv_cardinality_2_3= '+' ) ) )? ) )
              // InternalXtext.g:1284:2: ( (this_Assignment_0= ruleAssignment | this_AbstractTerminal_1= ruleAbstractTerminal ) ( ( (lv_cardinality_2_1= '?' | lv_cardinality_2_2= '*' | lv_cardinality_2_3= '+' ) ) )? )
              {
              // InternalXtext.g:1284:2: ( (this_Assignment_0= ruleAssignment | this_AbstractTerminal_1= ruleAbstractTerminal ) ( ( (lv_cardinality_2_1= '?' | lv_cardinality_2_2= '*' | lv_cardinality_2_3= '+' ) ) )? )
              // InternalXtext.g:1285:3: (this_Assignment_0= ruleAssignment | this_AbstractTerminal_1= ruleAbstractTerminal ) ( ( (lv_cardinality_2_1= '?' | lv_cardinality_2_2= '*' | lv_cardinality_2_3= '+' ) ) )?
              {
              // InternalXtext.g:1285:3: (this_Assignment_0= ruleAssignment | this_AbstractTerminal_1= ruleAbstractTerminal )
              int alt34=2;
              alt34 = dfa34.predict(input);
              switch (alt34) {
                  case 1 :
                      // InternalXtext.g:1286:4: this_Assignment_0= ruleAssignment
                      {
  
                      				newCompositeNode(grammarAccess.getAbstractTokenWithCardinalityAccess().getAssignmentParserRuleCall_0_0());
                      			
                      pushFollow(FollowSets000.FOLLOW_31);
                      this_Assignment_0=ruleAssignment();
  
                      state._fsp--;
  
  
                      				current = this_Assignment_0;
                      				afterParserOrEnumRuleCall();
                      			
  
                      }
                      break;
                  case 2 :
                      // InternalXtext.g:1295:4: this_AbstractTerminal_1= ruleAbstractTerminal
                      {
  
                      				newCompositeNode(grammarAccess.getAbstractTokenWithCardinalityAccess().getAbstractTerminalParserRuleCall_0_1());
                      			
                      pushFollow(FollowSets000.FOLLOW_31);
                      this_AbstractTerminal_1=ruleAbstractTerminal();
  
                      state._fsp--;
  
  
                      				current = this_AbstractTerminal_1;
                      				afterParserOrEnumRuleCall();
                      			
  
                      }
                      break;
  
              }
  
              // InternalXtext.g:1304:3: ( ( (lv_cardinality_2_1= '?' | lv_cardinality_2_2= '*' | lv_cardinality_2_3= '+' ) ) )?
              int alt36=2;
              int LA36_0 = input.LA(1);
  
              if ( (LA36_0==23||(LA36_0>=32 && LA36_0<=33)) ) {
                  alt36=1;
              }
              switch (alt36) {
                  case 1 :
                      // InternalXtext.g:1305:4: ( (lv_cardinality_2_1= '?' | lv_cardinality_2_2= '*' | lv_cardinality_2_3= '+' ) )
                      {
                      // InternalXtext.g:1305:4: ( (lv_cardinality_2_1= '?' | lv_cardinality_2_2= '*' | lv_cardinality_2_3= '+' ) )
                      // InternalXtext.g:1306:5: (lv_cardinality_2_1= '?' | lv_cardinality_2_2= '*' | lv_cardinality_2_3= '+' )
                      {
                      // InternalXtext.g:1306:5: (lv_cardinality_2_1= '?' | lv_cardinality_2_2= '*' | lv_cardinality_2_3= '+' )
                      int alt35=3;
                      switch ( input.LA(1) ) {
                      case 32:
                          {
                          alt35=1;
                          }
                          break;
                      case 23:
                          {
                          alt35=2;
                          }
                          break;
                      case 33:
                          {
                          alt35=3;
                          }
                          break;
                      default:
                          NoViableAltException nvae =
                              new NoViableAltException("", 35, 0, input);
  
                          throw nvae;
                      }
  
                      switch (alt35) {
                          case 1 :
                              // InternalXtext.g:1307:6: lv_cardinality_2_1= '?'
                              {
                              lv_cardinality_2_1=(Token)match(input,32,FollowSets000.FOLLOW_2); 
  
                              						newLeafNode(lv_cardinality_2_1, grammarAccess.getAbstractTokenWithCardinalityAccess().getCardinalityQuestionMarkKeyword_1_0_0());
                              					
  
                              						if (current==null) {
                              							current = createModelElement(grammarAccess.getAbstractTokenWithCardinalityRule());
                              						}
                              						setWithLastConsumed(current, "cardinality", lv_cardinality_2_1, null);
                              					
  
                              }
                              break;
                          case 2 :
                              // InternalXtext.g:1318:6: lv_cardinality_2_2= '*'
                              {
                              lv_cardinality_2_2=(Token)match(input,23,FollowSets000.FOLLOW_2); 
  
                              						newLeafNode(lv_cardinality_2_2, grammarAccess.getAbstractTokenWithCardinalityAccess().getCardinalityAsteriskKeyword_1_0_1());
                              					
  
                              						if (current==null) {
                              							current = createModelElement(grammarAccess.getAbstractTokenWithCardinalityRule());
                              						}
                              						setWithLastConsumed(current, "cardinality", lv_cardinality_2_2, null);
                              					
  
                              }
                              break;
                          case 3 :
                              // InternalXtext.g:1329:6: lv_cardinality_2_3= '+'
                              {
                              lv_cardinality_2_3=(Token)match(input,33,FollowSets000.FOLLOW_2); 
  
                              						newLeafNode(lv_cardinality_2_3, grammarAccess.getAbstractTokenWithCardinalityAccess().getCardinalityPlusSignKeyword_1_0_2());
                              					
  
                              						if (current==null) {
                              							current = createModelElement(grammarAccess.getAbstractTokenWithCardinalityRule());
                              						}
                              						setWithLastConsumed(current, "cardinality", lv_cardinality_2_3, null);
                              					
  
                              }
                              break;
  
                      }
  
  
                      }
  
  
                      }
                      break;
  
              }
  
  
              }
  
  
              }
  
  
              	leaveRule();
  
          }
  
              catch (RecognitionException re) {
                  recover(input,re);
                  appendSkippedTokens();
              }
          finally {
          }
          return current;
      }