docs: public final EObject ruleXOrExpression() throws RecognitionException {
          EObject current = null;
  
          EObject this_XAndExpression_0 = null;
  
          EObject lv_rightOperand_3_0 = null;
  
  
  
          	enterRule();
  
          try {
              // InternalSARL.g:12296:2: ( (this_XAndExpression_0= ruleXAndExpression ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )* ) )
              // InternalSARL.g:12297:2: (this_XAndExpression_0= ruleXAndExpression ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )* )
              {
              // InternalSARL.g:12297:2: (this_XAndExpression_0= ruleXAndExpression ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )* )
              // InternalSARL.g:12298:3: this_XAndExpression_0= ruleXAndExpression ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )*
              {
              if ( state.backtracking==0 ) {
  
                			newCompositeNode(grammarAccess.getXOrExpressionAccess().getXAndExpressionParserRuleCall_0());
                		
              }
              pushFollow(FOLLOW_115);
              this_XAndExpression_0=ruleXAndExpression();
  
              state._fsp--;
              if (state.failed) return current;
              if ( state.backtracking==0 ) {
  
                			current = this_XAndExpression_0;
                			afterParserOrEnumRuleCall();
                		
              }
              // InternalSARL.g:12306:3: ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )*
              loop302:
              do {
                  int alt302=2;
                  int LA302_0 = input.LA(1);
  
                  if ( (LA302_0==113) ) {
                      int LA302_2 = input.LA(2);
  
                      if ( (synpred31_InternalSARL()) ) {
                          alt302=1;
                      }
  
  
                  }
  
  
                  switch (alt302) {
              	case 1 :
              	    // InternalSARL.g:12307:4: ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) )
              	    {
              	    // InternalSARL.g:12307:4: ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) )
              	    // InternalSARL.g:12308:5: ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) )
              	    {
              	    // InternalSARL.g:12318:5: ( () ( ( ruleOpOr ) ) )
              	    // InternalSARL.g:12319:6: () ( ( ruleOpOr ) )
              	    {
              	    // InternalSARL.g:12319:6: ()
              	    // InternalSARL.g:12320:7: 
              	    {
              	    if ( state.backtracking==0 ) {
  
              	      							current = forceCreateModelElementAndSet(
              	      								grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
              	      								current);
              	      						
              	    }
  
              	    }
  
              	    // InternalSARL.g:12326:6: ( ( ruleOpOr ) )
              	    // InternalSARL.g:12327:7: ( ruleOpOr )
              	    {
              	    // InternalSARL.g:12327:7: ( ruleOpOr )
              	    // InternalSARL.g:12328:8: ruleOpOr
              	    {
              	    if ( state.backtracking==0 ) {
  
              	      								if (current==null) {
              	      									current = createModelElement(grammarAccess.getXOrExpressionRule());
              	      								}
              	      							
              	    }
              	    if ( state.backtracking==0 ) {
  
              	      								newCompositeNode(grammarAccess.getXOrExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0());
              	      							
              	    }
              	    pushFollow(FOLLOW_45);
              	    ruleOpOr();
  
              	    state._fsp--;
              	    if (state.failed) return current;
              	    if ( state.backtracking==0 ) {
  
              	      								afterParserOrEnumRuleCall();
              	      							
              	    }
  
              	    }
  
  
              	    }
  
  
              	    }
  
  
              	    }
  
              	    // InternalSARL.g:12344:4: ( (lv_rightOperand_3_0= ruleXAndExpression ) )
              	    // InternalSARL.g:12345:5: (lv_rightOperand_3_0= ruleXAndExpression )
              	    {
              	    // InternalSARL.g:12345:5: (lv_rightOperand_3_0= ruleXAndExpression )
              	    // InternalSARL.g:12346:6: lv_rightOperand_3_0= ruleXAndExpression
              	    {
              	    if ( state.backtracking==0 ) {
  
              	      						newCompositeNode(grammarAccess.getXOrExpressionAccess().getRightOperandXAndExpressionParserRuleCall_1_1_0());
              	      					
              	    }
              	    pushFollow(FOLLOW_115);
              	    lv_rightOperand_3_0=ruleXAndExpression();
  
              	    state._fsp--;
              	    if (state.failed) return current;
              	    if ( state.backtracking==0 ) {
  
              	      						if (current==null) {
              	      							current = createModelElementForParent(grammarAccess.getXOrExpressionRule());
              	      						}
              	      						set(
              	      							current,
              	      							"rightOperand",
              	      							lv_rightOperand_3_0,
              	      							"org.eclipse.xtext.xbase.Xbase.XAndExpression");
              	      						afterParserOrEnumRuleCall();
              	      					
              	    }
  
              	    }
  
  
              	    }
  
  
              	    }
              	    break;
  
              	default :
              	    break loop302;
                  }
              } while (true);
  
  
              }
  
  
              }
  
              if ( state.backtracking==0 ) {
  
                	leaveRule();
  
              }
          }
  
              catch (RecognitionException re) {
                  recover(input,re);
                  appendSkippedTokens();
              }
          finally {
          }
          return current;
      }