docs: public final EObject ruleXRelationalExpression() throws RecognitionException {
          EObject current = null;
  
          Token otherlv_2=null;
          EObject this_XOtherOperatorExpression_0 = null;
  
          EObject lv_type_3_0 = null;
  
          EObject lv_rightOperand_6_0 = null;
  
  
  
          	enterRule();
  
          try {
              // InternalSARL.g:12637:2: ( (this_XOtherOperatorExpression_0= ruleXOtherOperatorExpression ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )* ) )
              // InternalSARL.g:12638:2: (this_XOtherOperatorExpression_0= ruleXOtherOperatorExpression ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )* )
              {
              // InternalSARL.g:12638:2: (this_XOtherOperatorExpression_0= ruleXOtherOperatorExpression ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )* )
              // InternalSARL.g:12639:3: this_XOtherOperatorExpression_0= ruleXOtherOperatorExpression ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )*
              {
              if ( state.backtracking==0 ) {
  
                			newCompositeNode(grammarAccess.getXRelationalExpressionAccess().getXOtherOperatorExpressionParserRuleCall_0());
                		
              }
              pushFollow(FOLLOW_118);
              this_XOtherOperatorExpression_0=ruleXOtherOperatorExpression();
  
              state._fsp--;
              if (state.failed) return current;
              if ( state.backtracking==0 ) {
  
                			current = this_XOtherOperatorExpression_0;
                			afterParserOrEnumRuleCall();
                		
              }
              // InternalSARL.g:12647:3: ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )*
              loop306:
              do {
                  int alt306=3;
                  switch ( input.LA(1) ) {
                  case 40:
                      {
                      int LA306_2 = input.LA(2);
  
                      if ( (synpred35_InternalSARL()) ) {
                          alt306=2;
                      }
  
  
                      }
                      break;
                  case 41:
                      {
                      int LA306_3 = input.LA(2);
  
                      if ( (synpred35_InternalSARL()) ) {
                          alt306=2;
                      }
  
  
                      }
                      break;
                  case 119:
                      {
                      int LA306_4 = input.LA(2);
  
                      if ( (synpred34_InternalSARL()) ) {
                          alt306=1;
                      }
  
  
                      }
                      break;
                  case 112:
                      {
                      int LA306_5 = input.LA(2);
  
                      if ( (synpred35_InternalSARL()) ) {
                          alt306=2;
                      }
  
  
                      }
                      break;
  
                  }
  
                  switch (alt306) {
              	case 1 :
              	    // InternalSARL.g:12648:4: ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )
              	    {
              	    // InternalSARL.g:12648:4: ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )
              	    // InternalSARL.g:12649:5: ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) )
              	    {
              	    // InternalSARL.g:12649:5: ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) )
              	    // InternalSARL.g:12650:6: ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' )
              	    {
              	    // InternalSARL.g:12656:6: ( () otherlv_2= 'instanceof' )
              	    // InternalSARL.g:12657:7: () otherlv_2= 'instanceof'
              	    {
              	    // InternalSARL.g:12657:7: ()
              	    // InternalSARL.g:12658:8: 
              	    {
              	    if ( state.backtracking==0 ) {
  
              	      								current = forceCreateModelElementAndSet(
              	      									grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0(),
              	      									current);
              	      							
              	    }
  
              	    }
  
              	    otherlv_2=(Token)match(input,119,FOLLOW_41); if (state.failed) return current;
              	    if ( state.backtracking==0 ) {
  
              	      							newLeafNode(otherlv_2, grammarAccess.getXRelationalExpressionAccess().getInstanceofKeyword_1_0_0_0_1());
              	      						
              	    }
  
              	    }
  
  
              	    }
  
              	    // InternalSARL.g:12670:5: ( (lv_type_3_0= ruleJvmTypeReference ) )
              	    // InternalSARL.g:12671:6: (lv_type_3_0= ruleJvmTypeReference )
              	    {
              	    // InternalSARL.g:12671:6: (lv_type_3_0= ruleJvmTypeReference )
              	    // InternalSARL.g:12672:7: lv_type_3_0= ruleJvmTypeReference
              	    {
              	    if ( state.backtracking==0 ) {
  
              	      							newCompositeNode(grammarAccess.getXRelationalExpressionAccess().getTypeJvmTypeReferenceParserRuleCall_1_0_1_0());
              	      						
              	    }
              	    pushFollow(FOLLOW_118);
              	    lv_type_3_0=ruleJvmTypeReference();
  
              	    state._fsp--;
              	    if (state.failed) return current;
              	    if ( state.backtracking==0 ) {
  
              	      							if (current==null) {
              	      								current = createModelElementForParent(grammarAccess.getXRelationalExpressionRule());
              	      							}
              	      							set(
              	      								current,
              	      								"type",
              	      								lv_type_3_0,
              	      								"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
              	      							afterParserOrEnumRuleCall();
              	      						
              	    }
  
              	    }
  
  
              	    }
  
  
              	    }
  
  
              	    }
              	    break;
              	case 2 :
              	    // InternalSARL.g:12691:4: ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) )
              	    {
              	    // InternalSARL.g:12691:4: ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) )
              	    // InternalSARL.g:12692:5: ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) )
              	    {
              	    // InternalSARL.g:12692:5: ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) )
              	    // InternalSARL.g:12693:6: ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) )
              	    {
              	    // InternalSARL.g:12703:6: ( () ( ( ruleOpCompare ) ) )
              	    // InternalSARL.g:12704:7: () ( ( ruleOpCompare ) )
              	    {
              	    // InternalSARL.g:12704:7: ()
              	    // InternalSARL.g:12705:8: 
              	    {
              	    if ( state.backtracking==0 ) {
  
              	      								current = forceCreateModelElementAndSet(
              	      									grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0(),
              	      									current);
              	      							
              	    }
  
              	    }
  
              	    // InternalSARL.g:12711:7: ( ( ruleOpCompare ) )
              	    // InternalSARL.g:12712:8: ( ruleOpCompare )
              	    {
              	    // InternalSARL.g:12712:8: ( ruleOpCompare )
              	    // InternalSARL.g:12713:9: ruleOpCompare
              	    {
              	    if ( state.backtracking==0 ) {
  
              	      									if (current==null) {
              	      										current = createModelElement(grammarAccess.getXRelationalExpressionRule());
              	      									}
              	      								
              	    }
              	    if ( state.backtracking==0 ) {
  
              	      									newCompositeNode(grammarAccess.getXRelationalExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_1_0_0_1_0());
              	      								
              	    }
              	    pushFollow(FOLLOW_45);
              	    ruleOpCompare();
  
              	    state._fsp--;
              	    if (state.failed) return current;
              	    if ( state.backtracking==0 ) {
  
              	      									afterParserOrEnumRuleCall();
              	      								
              	    }
  
              	    }
  
  
              	    }
  
  
              	    }
  
  
              	    }
  
              	    // InternalSARL.g:12729:5: ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) )
              	    // InternalSARL.g:12730:6: (lv_rightOperand_6_0= ruleXOtherOperatorExpression )
              	    {
              	    // InternalSARL.g:12730:6: (lv_rightOperand_6_0= ruleXOtherOperatorExpression )
              	    // InternalSARL.g:12731:7: lv_rightOperand_6_0= ruleXOtherOperatorExpression
              	    {
              	    if ( state.backtracking==0 ) {
  
              	      							newCompositeNode(grammarAccess.getXRelationalExpressionAccess().getRightOperandXOtherOperatorExpressionParserRuleCall_1_1_1_0());
              	      						
              	    }
              	    pushFollow(FOLLOW_118);
              	    lv_rightOperand_6_0=ruleXOtherOperatorExpression();
  
              	    state._fsp--;
              	    if (state.failed) return current;
              	    if ( state.backtracking==0 ) {
  
              	      							if (current==null) {
              	      								current = createModelElementForParent(grammarAccess.getXRelationalExpressionRule());
              	      							}
              	      							set(
              	      								current,
              	      								"rightOperand",
              	      								lv_rightOperand_6_0,
              	      								"org.eclipse.xtext.xbase.Xbase.XOtherOperatorExpression");
              	      							afterParserOrEnumRuleCall();
              	      						
              	    }
  
              	    }
  
  
              	    }
  
  
              	    }
  
  
              	    }
              	    break;
  
              	default :
              	    break loop306;
                  }
              } while (true);
  
  
              }
  
  
              }
  
              if ( state.backtracking==0 ) {
  
                	leaveRule();
  
              }
          }
  
              catch (RecognitionException re) {
                  recover(input,re);
                  appendSkippedTokens();
              }
          finally {
          }
          return current;
      }