docs: public final EObject ruleXAssignment() throws RecognitionException {
          EObject current = null;
  
          EObject lv_value_3_0 = null;
  
          EObject this_XOrExpression_4 = null;
  
          EObject lv_rightOperand_7_0 = null;
  
  
  
          	enterRule();
  
          try {
              // InternalSARL.g:12049:2: ( ( ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) ) | (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? ) ) )
              // InternalSARL.g:12050:2: ( ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) ) | (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? ) )
              {
              // InternalSARL.g:12050:2: ( ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) ) | (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? ) )
              int alt299=2;
              alt299 = dfa299.predict(input);
              switch (alt299) {
                  case 1 :
                      // InternalSARL.g:12051:3: ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) )
                      {
                      // InternalSARL.g:12051:3: ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) )
                      // InternalSARL.g:12052:4: () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) )
                      {
                      // InternalSARL.g:12052:4: ()
                      // InternalSARL.g:12053:5: 
                      {
                      if ( state.backtracking==0 ) {
  
                        					current = forceCreateModelElement(
                        						grammarAccess.getXAssignmentAccess().getXAssignmentAction_0_0(),
                        						current);
                        				
                      }
  
                      }
  
                      // InternalSARL.g:12059:4: ( ( ruleFeatureCallID ) )
                      // InternalSARL.g:12060:5: ( ruleFeatureCallID )
                      {
                      // InternalSARL.g:12060:5: ( ruleFeatureCallID )
                      // InternalSARL.g:12061:6: ruleFeatureCallID
                      {
                      if ( state.backtracking==0 ) {
  
                        						if (current==null) {
                        							current = createModelElement(grammarAccess.getXAssignmentRule());
                        						}
                        					
                      }
                      if ( state.backtracking==0 ) {
  
                        						newCompositeNode(grammarAccess.getXAssignmentAccess().getFeatureJvmIdentifiableElementCrossReference_0_1_0());
                        					
                      }
                      pushFollow(FOLLOW_83);
                      ruleFeatureCallID();
  
                      state._fsp--;
                      if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        						afterParserOrEnumRuleCall();
                        					
                      }
  
                      }
  
  
                      }
  
                      if ( state.backtracking==0 ) {
  
                        				newCompositeNode(grammarAccess.getXAssignmentAccess().getOpSingleAssignParserRuleCall_0_2());
                        			
                      }
                      pushFollow(FOLLOW_45);
                      ruleOpSingleAssign();
  
                      state._fsp--;
                      if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        				afterParserOrEnumRuleCall();
                        			
                      }
                      // InternalSARL.g:12082:4: ( (lv_value_3_0= ruleXAssignment ) )
                      // InternalSARL.g:12083:5: (lv_value_3_0= ruleXAssignment )
                      {
                      // InternalSARL.g:12083:5: (lv_value_3_0= ruleXAssignment )
                      // InternalSARL.g:12084:6: lv_value_3_0= ruleXAssignment
                      {
                      if ( state.backtracking==0 ) {
  
                        						newCompositeNode(grammarAccess.getXAssignmentAccess().getValueXAssignmentParserRuleCall_0_3_0());
                        					
                      }
                      pushFollow(FOLLOW_2);
                      lv_value_3_0=ruleXAssignment();
  
                      state._fsp--;
                      if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        						if (current==null) {
                        							current = createModelElementForParent(grammarAccess.getXAssignmentRule());
                        						}
                        						set(
                        							current,
                        							"value",
                        							lv_value_3_0,
                        							"org.eclipse.xtext.xbase.Xbase.XAssignment");
                        						afterParserOrEnumRuleCall();
                        					
                      }
  
                      }
  
  
                      }
  
  
                      }
  
  
                      }
                      break;
                  case 2 :
                      // InternalSARL.g:12103:3: (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? )
                      {
                      // InternalSARL.g:12103:3: (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? )
                      // InternalSARL.g:12104:4: this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )?
                      {
                      if ( state.backtracking==0 ) {
  
                        				newCompositeNode(grammarAccess.getXAssignmentAccess().getXOrExpressionParserRuleCall_1_0());
                        			
                      }
                      pushFollow(FOLLOW_112);
                      this_XOrExpression_4=ruleXOrExpression();
  
                      state._fsp--;
                      if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        				current = this_XOrExpression_4;
                        				afterParserOrEnumRuleCall();
                        			
                      }
                      // InternalSARL.g:12112:4: ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )?
                      int alt298=2;
                      alt298 = dfa298.predict(input);
                      switch (alt298) {
                          case 1 :
                              // InternalSARL.g:12113:5: ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) )
                              {
                              // InternalSARL.g:12113:5: ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) )
                              // InternalSARL.g:12114:6: ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) )
                              {
                              // InternalSARL.g:12124:6: ( () ( ( ruleOpMultiAssign ) ) )
                              // InternalSARL.g:12125:7: () ( ( ruleOpMultiAssign ) )
                              {
                              // InternalSARL.g:12125:7: ()
                              // InternalSARL.g:12126:8: 
                              {
                              if ( state.backtracking==0 ) {
  
                                								current = forceCreateModelElementAndSet(
                                									grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0(),
                                									current);
                                							
                              }
  
                              }
  
                              // InternalSARL.g:12132:7: ( ( ruleOpMultiAssign ) )
                              // InternalSARL.g:12133:8: ( ruleOpMultiAssign )
                              {
                              // InternalSARL.g:12133:8: ( ruleOpMultiAssign )
                              // InternalSARL.g:12134:9: ruleOpMultiAssign
                              {
                              if ( state.backtracking==0 ) {
  
                                									if (current==null) {
                                										current = createModelElement(grammarAccess.getXAssignmentRule());
                                									}
                                								
                              }
                              if ( state.backtracking==0 ) {
  
                                									newCompositeNode(grammarAccess.getXAssignmentAccess().getFeatureJvmIdentifiableElementCrossReference_1_1_0_0_1_0());
                                								
                              }
                              pushFollow(FOLLOW_45);
                              ruleOpMultiAssign();
  
                              state._fsp--;
                              if (state.failed) return current;
                              if ( state.backtracking==0 ) {
  
                                									afterParserOrEnumRuleCall();
                                								
                              }
  
                              }
  
  
                              }
  
  
                              }
  
  
                              }
  
                              // InternalSARL.g:12150:5: ( (lv_rightOperand_7_0= ruleXAssignment ) )
                              // InternalSARL.g:12151:6: (lv_rightOperand_7_0= ruleXAssignment )
                              {
                              // InternalSARL.g:12151:6: (lv_rightOperand_7_0= ruleXAssignment )
                              // InternalSARL.g:12152:7: lv_rightOperand_7_0= ruleXAssignment
                              {
                              if ( state.backtracking==0 ) {
  
                                							newCompositeNode(grammarAccess.getXAssignmentAccess().getRightOperandXAssignmentParserRuleCall_1_1_1_0());
                                						
                              }
                              pushFollow(FOLLOW_2);
                              lv_rightOperand_7_0=ruleXAssignment();
  
                              state._fsp--;
                              if (state.failed) return current;
                              if ( state.backtracking==0 ) {
  
                                							if (current==null) {
                                								current = createModelElementForParent(grammarAccess.getXAssignmentRule());
                                							}
                                							set(
                                								current,
                                								"rightOperand",
                                								lv_rightOperand_7_0,
                                								"org.eclipse.xtext.xbase.Xbase.XAssignment");
                                							afterParserOrEnumRuleCall();
                                						
                              }
  
                              }
  
  
                              }
  
  
                              }
                              break;
  
                      }
  
  
                      }
  
  
                      }
                      break;
  
              }
  
  
              }
  
              if ( state.backtracking==0 ) {
  
                	leaveRule();
  
              }
          }
  
              catch (RecognitionException re) {
                  recover(input,re);
                  appendSkippedTokens();
              }
          finally {
          }
          return current;
      }