docs: public final EObject ruleXEqualityExpression() throws RecognitionException {
          EObject current = null;
  
          EObject this_XRelationalExpression_0 = null;
  
          EObject lv_rightOperand_3_0 = null;
  
  
  
          	enterRule();
  
          try {
              // InternalSARL.g:12510:2: ( (this_XRelationalExpression_0= ruleXRelationalExpression ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )* ) )
              // InternalSARL.g:12511:2: (this_XRelationalExpression_0= ruleXRelationalExpression ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )* )
              {
              // InternalSARL.g:12511:2: (this_XRelationalExpression_0= ruleXRelationalExpression ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )* )
              // InternalSARL.g:12512:3: this_XRelationalExpression_0= ruleXRelationalExpression ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )*
              {
              if ( state.backtracking==0 ) {
  
                			newCompositeNode(grammarAccess.getXEqualityExpressionAccess().getXRelationalExpressionParserRuleCall_0());
                		
              }
              pushFollow(FOLLOW_117);
              this_XRelationalExpression_0=ruleXRelationalExpression();
  
              state._fsp--;
              if (state.failed) return current;
              if ( state.backtracking==0 ) {
  
                			current = this_XRelationalExpression_0;
                			afterParserOrEnumRuleCall();
                		
              }
              // InternalSARL.g:12520:3: ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )*
              loop304:
              do {
                  int alt304=2;
                  switch ( input.LA(1) ) {
                  case 115:
                      {
                      int LA304_2 = input.LA(2);
  
                      if ( (synpred33_InternalSARL()) ) {
                          alt304=1;
                      }
  
  
                      }
                      break;
                  case 116:
                      {
                      int LA304_3 = input.LA(2);
  
                      if ( (synpred33_InternalSARL()) ) {
                          alt304=1;
                      }
  
  
                      }
                      break;
                  case 117:
                      {
                      int LA304_4 = input.LA(2);
  
                      if ( (synpred33_InternalSARL()) ) {
                          alt304=1;
                      }
  
  
                      }
                      break;
                  case 118:
                      {
                      int LA304_5 = input.LA(2);
  
                      if ( (synpred33_InternalSARL()) ) {
                          alt304=1;
                      }
  
  
                      }
                      break;
  
                  }
  
                  switch (alt304) {
              	case 1 :
              	    // InternalSARL.g:12521:4: ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) )
              	    {
              	    // InternalSARL.g:12521:4: ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) )
              	    // InternalSARL.g:12522:5: ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) )
              	    {
              	    // InternalSARL.g:12532:5: ( () ( ( ruleOpEquality ) ) )
              	    // InternalSARL.g:12533:6: () ( ( ruleOpEquality ) )
              	    {
              	    // InternalSARL.g:12533:6: ()
              	    // InternalSARL.g:12534:7: 
              	    {
              	    if ( state.backtracking==0 ) {
  
              	      							current = forceCreateModelElementAndSet(
              	      								grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
              	      								current);
              	      						
              	    }
  
              	    }
  
              	    // InternalSARL.g:12540:6: ( ( ruleOpEquality ) )
              	    // InternalSARL.g:12541:7: ( ruleOpEquality )
              	    {
              	    // InternalSARL.g:12541:7: ( ruleOpEquality )
              	    // InternalSARL.g:12542:8: ruleOpEquality
              	    {
              	    if ( state.backtracking==0 ) {
  
              	      								if (current==null) {
              	      									current = createModelElement(grammarAccess.getXEqualityExpressionRule());
              	      								}
              	      							
              	    }
              	    if ( state.backtracking==0 ) {
  
              	      								newCompositeNode(grammarAccess.getXEqualityExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0());
              	      							
              	    }
              	    pushFollow(FOLLOW_45);
              	    ruleOpEquality();
  
              	    state._fsp--;
              	    if (state.failed) return current;
              	    if ( state.backtracking==0 ) {
  
              	      								afterParserOrEnumRuleCall();
              	      							
              	    }
  
              	    }
  
  
              	    }
  
  
              	    }
  
  
              	    }
  
              	    // InternalSARL.g:12558:4: ( (lv_rightOperand_3_0= ruleXRelationalExpression ) )
              	    // InternalSARL.g:12559:5: (lv_rightOperand_3_0= ruleXRelationalExpression )
              	    {
              	    // InternalSARL.g:12559:5: (lv_rightOperand_3_0= ruleXRelationalExpression )
              	    // InternalSARL.g:12560:6: lv_rightOperand_3_0= ruleXRelationalExpression
              	    {
              	    if ( state.backtracking==0 ) {
  
              	      						newCompositeNode(grammarAccess.getXEqualityExpressionAccess().getRightOperandXRelationalExpressionParserRuleCall_1_1_0());
              	      					
              	    }
              	    pushFollow(FOLLOW_117);
              	    lv_rightOperand_3_0=ruleXRelationalExpression();
  
              	    state._fsp--;
              	    if (state.failed) return current;
              	    if ( state.backtracking==0 ) {
  
              	      						if (current==null) {
              	      							current = createModelElementForParent(grammarAccess.getXEqualityExpressionRule());
              	      						}
              	      						set(
              	      							current,
              	      							"rightOperand",
              	      							lv_rightOperand_3_0,
              	      							"org.eclipse.xtext.xbase.Xbase.XRelationalExpression");
              	      						afterParserOrEnumRuleCall();
              	      					
              	    }
  
              	    }
  
  
              	    }
  
  
              	    }
              	    break;
  
              	default :
              	    break loop304;
                  }
              } while (true);
  
  
              }
  
  
              }
  
              if ( state.backtracking==0 ) {
  
                	leaveRule();
  
              }
          }
  
              catch (RecognitionException re) {
                  recover(input,re);
                  appendSkippedTokens();
              }
          finally {
          }
          return current;
      }