docs: public final EObject ruleJvmWildcardTypeReference() throws RecognitionException {
          EObject current = null;
  
          Token otherlv_1=null;
          EObject lv_constraints_2_0 = null;
  
          EObject lv_constraints_3_0 = null;
  
          EObject lv_constraints_4_0 = null;
  
          EObject lv_constraints_5_0 = null;
  
  
  
          	enterRule();
  
          try {
              // InternalSARL.g:16294:2: ( ( () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )? ) )
              // InternalSARL.g:16295:2: ( () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )? )
              {
              // InternalSARL.g:16295:2: ( () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )? )
              // InternalSARL.g:16296:3: () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )?
              {
              // InternalSARL.g:16296:3: ()
              // InternalSARL.g:16297:4: 
              {
              if ( state.backtracking==0 ) {
  
                				current = forceCreateModelElement(
                					grammarAccess.getJvmWildcardTypeReferenceAccess().getJvmWildcardTypeReferenceAction_0(),
                					current);
                			
              }
  
              }
  
              otherlv_1=(Token)match(input,143,FOLLOW_153); if (state.failed) return current;
              if ( state.backtracking==0 ) {
  
                			newLeafNode(otherlv_1, grammarAccess.getJvmWildcardTypeReferenceAccess().getQuestionMarkKeyword_1());
                		
              }
              // InternalSARL.g:16307:3: ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )?
              int alt378=3;
              int LA378_0 = input.LA(1);
  
              if ( (LA378_0==28) ) {
                  alt378=1;
              }
              else if ( (LA378_0==133) ) {
                  alt378=2;
              }
              switch (alt378) {
                  case 1 :
                      // InternalSARL.g:16308:4: ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* )
                      {
                      // InternalSARL.g:16308:4: ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* )
                      // InternalSARL.g:16309:5: ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )*
                      {
                      // InternalSARL.g:16309:5: ( (lv_constraints_2_0= ruleJvmUpperBound ) )
                      // InternalSARL.g:16310:6: (lv_constraints_2_0= ruleJvmUpperBound )
                      {
                      // InternalSARL.g:16310:6: (lv_constraints_2_0= ruleJvmUpperBound )
                      // InternalSARL.g:16311:7: lv_constraints_2_0= ruleJvmUpperBound
                      {
                      if ( state.backtracking==0 ) {
  
                        							newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmUpperBoundParserRuleCall_2_0_0_0());
                        						
                      }
                      pushFollow(FOLLOW_154);
                      lv_constraints_2_0=ruleJvmUpperBound();
  
                      state._fsp--;
                      if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        							if (current==null) {
                        								current = createModelElementForParent(grammarAccess.getJvmWildcardTypeReferenceRule());
                        							}
                        							add(
                        								current,
                        								"constraints",
                        								lv_constraints_2_0,
                        								"org.eclipse.xtext.xbase.Xtype.JvmUpperBound");
                        							afterParserOrEnumRuleCall();
                        						
                      }
  
                      }
  
  
                      }
  
                      // InternalSARL.g:16328:5: ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )*
                      loop376:
                      do {
                          int alt376=2;
                          int LA376_0 = input.LA(1);
  
                          if ( (LA376_0==144) ) {
                              alt376=1;
                          }
  
  
                          switch (alt376) {
                      	case 1 :
                      	    // InternalSARL.g:16329:6: (lv_constraints_3_0= ruleJvmUpperBoundAnded )
                      	    {
                      	    // InternalSARL.g:16329:6: (lv_constraints_3_0= ruleJvmUpperBoundAnded )
                      	    // InternalSARL.g:16330:7: lv_constraints_3_0= ruleJvmUpperBoundAnded
                      	    {
                      	    if ( state.backtracking==0 ) {
  
                      	      							newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmUpperBoundAndedParserRuleCall_2_0_1_0());
                      	      						
                      	    }
                      	    pushFollow(FOLLOW_154);
                      	    lv_constraints_3_0=ruleJvmUpperBoundAnded();
  
                      	    state._fsp--;
                      	    if (state.failed) return current;
                      	    if ( state.backtracking==0 ) {
  
                      	      							if (current==null) {
                      	      								current = createModelElementForParent(grammarAccess.getJvmWildcardTypeReferenceRule());
                      	      							}
                      	      							add(
                      	      								current,
                      	      								"constraints",
                      	      								lv_constraints_3_0,
                      	      								"org.eclipse.xtext.xbase.Xtype.JvmUpperBoundAnded");
                      	      							afterParserOrEnumRuleCall();
                      	      						
                      	    }
  
                      	    }
  
  
                      	    }
                      	    break;
  
                      	default :
                      	    break loop376;
                          }
                      } while (true);
  
  
                      }
  
  
                      }
                      break;
                  case 2 :
                      // InternalSARL.g:16349:4: ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* )
                      {
                      // InternalSARL.g:16349:4: ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* )
                      // InternalSARL.g:16350:5: ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )*
                      {
                      // InternalSARL.g:16350:5: ( (lv_constraints_4_0= ruleJvmLowerBound ) )
                      // InternalSARL.g:16351:6: (lv_constraints_4_0= ruleJvmLowerBound )
                      {
                      // InternalSARL.g:16351:6: (lv_constraints_4_0= ruleJvmLowerBound )
                      // InternalSARL.g:16352:7: lv_constraints_4_0= ruleJvmLowerBound
                      {
                      if ( state.backtracking==0 ) {
  
                        							newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmLowerBoundParserRuleCall_2_1_0_0());
                        						
                      }
                      pushFollow(FOLLOW_154);
                      lv_constraints_4_0=ruleJvmLowerBound();
  
                      state._fsp--;
                      if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        							if (current==null) {
                        								current = createModelElementForParent(grammarAccess.getJvmWildcardTypeReferenceRule());
                        							}
                        							add(
                        								current,
                        								"constraints",
                        								lv_constraints_4_0,
                        								"org.eclipse.xtext.xbase.Xtype.JvmLowerBound");
                        							afterParserOrEnumRuleCall();
                        						
                      }
  
                      }
  
  
                      }
  
                      // InternalSARL.g:16369:5: ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )*
                      loop377:
                      do {
                          int alt377=2;
                          int LA377_0 = input.LA(1);
  
                          if ( (LA377_0==144) ) {
                              alt377=1;
                          }
  
  
                          switch (alt377) {
                      	case 1 :
                      	    // InternalSARL.g:16370:6: (lv_constraints_5_0= ruleJvmLowerBoundAnded )
                      	    {
                      	    // InternalSARL.g:16370:6: (lv_constraints_5_0= ruleJvmLowerBoundAnded )
                      	    // InternalSARL.g:16371:7: lv_constraints_5_0= ruleJvmLowerBoundAnded
                      	    {
                      	    if ( state.backtracking==0 ) {
  
                      	      							newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmLowerBoundAndedParserRuleCall_2_1_1_0());
                      	      						
                      	    }
                      	    pushFollow(FOLLOW_154);
                      	    lv_constraints_5_0=ruleJvmLowerBoundAnded();
  
                      	    state._fsp--;
                      	    if (state.failed) return current;
                      	    if ( state.backtracking==0 ) {
  
                      	      							if (current==null) {
                      	      								current = createModelElementForParent(grammarAccess.getJvmWildcardTypeReferenceRule());
                      	      							}
                      	      							add(
                      	      								current,
                      	      								"constraints",
                      	      								lv_constraints_5_0,
                      	      								"org.eclipse.xtext.xbase.Xtype.JvmLowerBoundAnded");
                      	      							afterParserOrEnumRuleCall();
                      	      						
                      	    }
  
                      	    }
  
  
                      	    }
                      	    break;
  
                      	default :
                      	    break loop377;
                          }
                      } while (true);
  
  
                      }
  
  
                      }
                      break;
  
              }
  
  
              }
  
  
              }
  
              if ( state.backtracking==0 ) {
  
                	leaveRule();
  
              }
          }
  
              catch (RecognitionException re) {
                  recover(input,re);
                  appendSkippedTokens();
              }
          finally {
          }
          return current;
      }