docs: public final EObject ruleMultiTypeReference() throws RecognitionException {
          EObject current = null;
  
          Token otherlv_2=null;
          EObject this_JvmTypeReference_0 = null;
  
          EObject lv_references_3_0 = null;
  
  
  
          	enterRule();
  
          try {
              // InternalSARL.g:10427:2: ( (this_JvmTypeReference_0= ruleJvmTypeReference ( () (otherlv_2= '|' ( (lv_references_3_0= ruleJvmTypeReference ) ) )+ )? ) )
              // InternalSARL.g:10428:2: (this_JvmTypeReference_0= ruleJvmTypeReference ( () (otherlv_2= '|' ( (lv_references_3_0= ruleJvmTypeReference ) ) )+ )? )
              {
              // InternalSARL.g:10428:2: (this_JvmTypeReference_0= ruleJvmTypeReference ( () (otherlv_2= '|' ( (lv_references_3_0= ruleJvmTypeReference ) ) )+ )? )
              // InternalSARL.g:10429:3: this_JvmTypeReference_0= ruleJvmTypeReference ( () (otherlv_2= '|' ( (lv_references_3_0= ruleJvmTypeReference ) ) )+ )?
              {
              if ( state.backtracking==0 ) {
  
                			newCompositeNode(grammarAccess.getMultiTypeReferenceAccess().getJvmTypeReferenceParserRuleCall_0());
                		
              }
              pushFollow(FOLLOW_98);
              this_JvmTypeReference_0=ruleJvmTypeReference();
  
              state._fsp--;
              if (state.failed) return current;
              if ( state.backtracking==0 ) {
  
                			current = this_JvmTypeReference_0;
                			afterParserOrEnumRuleCall();
                		
              }
              // InternalSARL.g:10437:3: ( () (otherlv_2= '|' ( (lv_references_3_0= ruleJvmTypeReference ) ) )+ )?
              int alt267=2;
              int LA267_0 = input.LA(1);
  
              if ( (LA267_0==97) ) {
                  alt267=1;
              }
              switch (alt267) {
                  case 1 :
                      // InternalSARL.g:10438:4: () (otherlv_2= '|' ( (lv_references_3_0= ruleJvmTypeReference ) ) )+
                      {
                      // InternalSARL.g:10438:4: ()
                      // InternalSARL.g:10439:5: 
                      {
                      if ( state.backtracking==0 ) {
  
                        					current = forceCreateModelElementAndAdd(
                        						grammarAccess.getMultiTypeReferenceAccess().getJvmSynonymTypeReferenceReferencesAction_1_0(),
                        						current);
                        				
                      }
  
                      }
  
                      // InternalSARL.g:10445:4: (otherlv_2= '|' ( (lv_references_3_0= ruleJvmTypeReference ) ) )+
                      int cnt266=0;
                      loop266:
                      do {
                          int alt266=2;
                          int LA266_0 = input.LA(1);
  
                          if ( (LA266_0==97) ) {
                              alt266=1;
                          }
  
  
                          switch (alt266) {
                      	case 1 :
                      	    // InternalSARL.g:10446:5: otherlv_2= '|' ( (lv_references_3_0= ruleJvmTypeReference ) )
                      	    {
                      	    otherlv_2=(Token)match(input,97,FOLLOW_41); if (state.failed) return current;
                      	    if ( state.backtracking==0 ) {
  
                      	      					newLeafNode(otherlv_2, grammarAccess.getMultiTypeReferenceAccess().getVerticalLineKeyword_1_1_0());
                      	      				
                      	    }
                      	    // InternalSARL.g:10450:5: ( (lv_references_3_0= ruleJvmTypeReference ) )
                      	    // InternalSARL.g:10451:6: (lv_references_3_0= ruleJvmTypeReference )
                      	    {
                      	    // InternalSARL.g:10451:6: (lv_references_3_0= ruleJvmTypeReference )
                      	    // InternalSARL.g:10452:7: lv_references_3_0= ruleJvmTypeReference
                      	    {
                      	    if ( state.backtracking==0 ) {
  
                      	      							newCompositeNode(grammarAccess.getMultiTypeReferenceAccess().getReferencesJvmTypeReferenceParserRuleCall_1_1_1_0());
                      	      						
                      	    }
                      	    pushFollow(FOLLOW_98);
                      	    lv_references_3_0=ruleJvmTypeReference();
  
                      	    state._fsp--;
                      	    if (state.failed) return current;
                      	    if ( state.backtracking==0 ) {
  
                      	      							if (current==null) {
                      	      								current = createModelElementForParent(grammarAccess.getMultiTypeReferenceRule());
                      	      							}
                      	      							add(
                      	      								current,
                      	      								"references",
                      	      								lv_references_3_0,
                      	      								"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
                      	      							afterParserOrEnumRuleCall();
                      	      						
                      	    }
  
                      	    }
  
  
                      	    }
  
  
                      	    }
                      	    break;
  
                      	default :
                      	    if ( cnt266 >= 1 ) break loop266;
                      	    if (state.backtracking>0) {state.failed=true; return current;}
                                  EarlyExitException eee =
                                      new EarlyExitException(266, input);
                                  throw eee;
                          }
                          cnt266++;
                      } while (true);
  
  
                      }
                      break;
  
              }
  
  
              }
  
  
              }
  
              if ( state.backtracking==0 ) {
  
                	leaveRule();
  
              }
          }
  
              catch (RecognitionException re) {
                  recover(input,re);
                  appendSkippedTokens();
              }
          finally {
          }
          return current;
      }