docs: public final EObject ruleCrossReference() throws RecognitionException {
          EObject current = null;
  
          Token otherlv_0=null;
          Token otherlv_2=null;
          Token otherlv_4=null;
          EObject lv_type_1_0 = null;
  
          EObject lv_terminal_3_0 = null;
  
  
  
          	enterRule();
  
          try {
              // InternalXtext.g:2640:2: ( (otherlv_0= '[' ( (lv_type_1_0= ruleTypeRef ) ) (otherlv_2= '|' ( (lv_terminal_3_0= ruleCrossReferenceableTerminal ) ) )? otherlv_4= ']' ) )
              // InternalXtext.g:2641:2: (otherlv_0= '[' ( (lv_type_1_0= ruleTypeRef ) ) (otherlv_2= '|' ( (lv_terminal_3_0= ruleCrossReferenceableTerminal ) ) )? otherlv_4= ']' )
              {
              // InternalXtext.g:2641:2: (otherlv_0= '[' ( (lv_type_1_0= ruleTypeRef ) ) (otherlv_2= '|' ( (lv_terminal_3_0= ruleCrossReferenceableTerminal ) ) )? otherlv_4= ']' )
              // InternalXtext.g:2642:3: otherlv_0= '[' ( (lv_type_1_0= ruleTypeRef ) ) (otherlv_2= '|' ( (lv_terminal_3_0= ruleCrossReferenceableTerminal ) ) )? otherlv_4= ']'
              {
              otherlv_0=(Token)match(input,45,FollowSets000.FOLLOW_13); 
  
              			newLeafNode(otherlv_0, grammarAccess.getCrossReferenceAccess().getLeftSquareBracketKeyword_0());
              		
              // InternalXtext.g:2646:3: ( (lv_type_1_0= ruleTypeRef ) )
              // InternalXtext.g:2647:4: (lv_type_1_0= ruleTypeRef )
              {
              // InternalXtext.g:2647:4: (lv_type_1_0= ruleTypeRef )
              // InternalXtext.g:2648:5: lv_type_1_0= ruleTypeRef
              {
  
              					newCompositeNode(grammarAccess.getCrossReferenceAccess().getTypeTypeRefParserRuleCall_1_0());
              				
              pushFollow(FollowSets000.FOLLOW_41);
              lv_type_1_0=ruleTypeRef();
  
              state._fsp--;
  
  
              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getCrossReferenceRule());
              					}
              					set(
              						current,
              						"type",
              						lv_type_1_0,
              						"org.eclipse.xtext.Xtext.TypeRef");
              					afterParserOrEnumRuleCall();
              				
  
              }
  
  
              }
  
              // InternalXtext.g:2665:3: (otherlv_2= '|' ( (lv_terminal_3_0= ruleCrossReferenceableTerminal ) ) )?
              int alt59=2;
              int LA59_0 = input.LA(1);
  
              if ( (LA59_0==30) ) {
                  alt59=1;
              }
              switch (alt59) {
                  case 1 :
                      // InternalXtext.g:2666:4: otherlv_2= '|' ( (lv_terminal_3_0= ruleCrossReferenceableTerminal ) )
                      {
                      otherlv_2=(Token)match(input,30,FollowSets000.FOLLOW_42); 
  
                      				newLeafNode(otherlv_2, grammarAccess.getCrossReferenceAccess().getVerticalLineKeyword_2_0());
                      			
                      // InternalXtext.g:2670:4: ( (lv_terminal_3_0= ruleCrossReferenceableTerminal ) )
                      // InternalXtext.g:2671:5: (lv_terminal_3_0= ruleCrossReferenceableTerminal )
                      {
                      // InternalXtext.g:2671:5: (lv_terminal_3_0= ruleCrossReferenceableTerminal )
                      // InternalXtext.g:2672:6: lv_terminal_3_0= ruleCrossReferenceableTerminal
                      {
  
                      						newCompositeNode(grammarAccess.getCrossReferenceAccess().getTerminalCrossReferenceableTerminalParserRuleCall_2_1_0());
                      					
                      pushFollow(FollowSets000.FOLLOW_43);
                      lv_terminal_3_0=ruleCrossReferenceableTerminal();
  
                      state._fsp--;
  
  
                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getCrossReferenceRule());
                      						}
                      						set(
                      							current,
                      							"terminal",
                      							lv_terminal_3_0,
                      							"org.eclipse.xtext.Xtext.CrossReferenceableTerminal");
                      						afterParserOrEnumRuleCall();
                      					
  
                      }
  
  
                      }
  
  
                      }
                      break;
  
              }
  
              otherlv_4=(Token)match(input,46,FollowSets000.FOLLOW_2); 
  
              			newLeafNode(otherlv_4, grammarAccess.getCrossReferenceAccess().getRightSquareBracketKeyword_3());
              		
  
              }
  
  
              }
  
  
              	leaveRule();
  
          }
  
              catch (RecognitionException re) {
                  recover(input,re);
                  appendSkippedTokens();
              }
          finally {
          }
          return current;
      }