docs: public final EObject ruleAssignment() throws RecognitionException {
          EObject current = null;
  
          Token lv_predicated_0_0=null;
          Token lv_firstSetPredicated_1_0=null;
          Token lv_operator_3_1=null;
          Token lv_operator_3_2=null;
          Token lv_operator_3_3=null;
          AntlrDatatypeRuleToken lv_feature_2_0 = null;
  
          EObject lv_terminal_4_0 = null;
  
  
  
          	enterRule();
  
          try {
              // InternalXtext.g:2364:2: ( ( ( ( (lv_predicated_0_0= '=>' ) ) | ( (lv_firstSetPredicated_1_0= '->' ) ) )? ( (lv_feature_2_0= ruleValidID ) ) ( ( (lv_operator_3_1= '+=' | lv_operator_3_2= '=' | lv_operator_3_3= '?=' ) ) ) ( (lv_terminal_4_0= ruleAssignableTerminal ) ) ) )
              // InternalXtext.g:2365:2: ( ( ( (lv_predicated_0_0= '=>' ) ) | ( (lv_firstSetPredicated_1_0= '->' ) ) )? ( (lv_feature_2_0= ruleValidID ) ) ( ( (lv_operator_3_1= '+=' | lv_operator_3_2= '=' | lv_operator_3_3= '?=' ) ) ) ( (lv_terminal_4_0= ruleAssignableTerminal ) ) )
              {
              // InternalXtext.g:2365:2: ( ( ( (lv_predicated_0_0= '=>' ) ) | ( (lv_firstSetPredicated_1_0= '->' ) ) )? ( (lv_feature_2_0= ruleValidID ) ) ( ( (lv_operator_3_1= '+=' | lv_operator_3_2= '=' | lv_operator_3_3= '?=' ) ) ) ( (lv_terminal_4_0= ruleAssignableTerminal ) ) )
              // InternalXtext.g:2366:3: ( ( (lv_predicated_0_0= '=>' ) ) | ( (lv_firstSetPredicated_1_0= '->' ) ) )? ( (lv_feature_2_0= ruleValidID ) ) ( ( (lv_operator_3_1= '+=' | lv_operator_3_2= '=' | lv_operator_3_3= '?=' ) ) ) ( (lv_terminal_4_0= ruleAssignableTerminal ) )
              {
              // InternalXtext.g:2366:3: ( ( (lv_predicated_0_0= '=>' ) ) | ( (lv_firstSetPredicated_1_0= '->' ) ) )?
              int alt54=3;
              int LA54_0 = input.LA(1);
  
              if ( (LA54_0==42) ) {
                  alt54=1;
              }
              else if ( (LA54_0==43) ) {
                  alt54=2;
              }
              switch (alt54) {
                  case 1 :
                      // InternalXtext.g:2367:4: ( (lv_predicated_0_0= '=>' ) )
                      {
                      // InternalXtext.g:2367:4: ( (lv_predicated_0_0= '=>' ) )
                      // InternalXtext.g:2368:5: (lv_predicated_0_0= '=>' )
                      {
                      // InternalXtext.g:2368:5: (lv_predicated_0_0= '=>' )
                      // InternalXtext.g:2369:6: lv_predicated_0_0= '=>'
                      {
                      lv_predicated_0_0=(Token)match(input,42,FollowSets000.FOLLOW_3); 
  
                      						newLeafNode(lv_predicated_0_0, grammarAccess.getAssignmentAccess().getPredicatedEqualsSignGreaterThanSignKeyword_0_0_0());
                      					
  
                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getAssignmentRule());
                      						}
                      						setWithLastConsumed(current, "predicated", true, "=>");
                      					
  
                      }
  
  
                      }
  
  
                      }
                      break;
                  case 2 :
                      // InternalXtext.g:2382:4: ( (lv_firstSetPredicated_1_0= '->' ) )
                      {
                      // InternalXtext.g:2382:4: ( (lv_firstSetPredicated_1_0= '->' ) )
                      // InternalXtext.g:2383:5: (lv_firstSetPredicated_1_0= '->' )
                      {
                      // InternalXtext.g:2383:5: (lv_firstSetPredicated_1_0= '->' )
                      // InternalXtext.g:2384:6: lv_firstSetPredicated_1_0= '->'
                      {
                      lv_firstSetPredicated_1_0=(Token)match(input,43,FollowSets000.FOLLOW_3); 
  
                      						newLeafNode(lv_firstSetPredicated_1_0, grammarAccess.getAssignmentAccess().getFirstSetPredicatedHyphenMinusGreaterThanSignKeyword_0_1_0());
                      					
  
                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getAssignmentRule());
                      						}
                      						setWithLastConsumed(current, "firstSetPredicated", true, "->");
                      					
  
                      }
  
  
                      }
  
  
                      }
                      break;
  
              }
  
              // InternalXtext.g:2397:3: ( (lv_feature_2_0= ruleValidID ) )
              // InternalXtext.g:2398:4: (lv_feature_2_0= ruleValidID )
              {
              // InternalXtext.g:2398:4: (lv_feature_2_0= ruleValidID )
              // InternalXtext.g:2399:5: lv_feature_2_0= ruleValidID
              {
  
              					newCompositeNode(grammarAccess.getAssignmentAccess().getFeatureValidIDParserRuleCall_1_0());
              				
              pushFollow(FollowSets000.FOLLOW_39);
              lv_feature_2_0=ruleValidID();
  
              state._fsp--;
  
  
              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getAssignmentRule());
              					}
              					set(
              						current,
              						"feature",
              						lv_feature_2_0,
              						"org.eclipse.xtext.Xtext.ValidID");
              					afterParserOrEnumRuleCall();
              				
  
              }
  
  
              }
  
              // InternalXtext.g:2416:3: ( ( (lv_operator_3_1= '+=' | lv_operator_3_2= '=' | lv_operator_3_3= '?=' ) ) )
              // InternalXtext.g:2417:4: ( (lv_operator_3_1= '+=' | lv_operator_3_2= '=' | lv_operator_3_3= '?=' ) )
              {
              // InternalXtext.g:2417:4: ( (lv_operator_3_1= '+=' | lv_operator_3_2= '=' | lv_operator_3_3= '?=' ) )
              // InternalXtext.g:2418:5: (lv_operator_3_1= '+=' | lv_operator_3_2= '=' | lv_operator_3_3= '?=' )
              {
              // InternalXtext.g:2418:5: (lv_operator_3_1= '+=' | lv_operator_3_2= '=' | lv_operator_3_3= '?=' )
              int alt55=3;
              switch ( input.LA(1) ) {
              case 36:
                  {
                  alt55=1;
                  }
                  break;
              case 35:
                  {
                  alt55=2;
                  }
                  break;
              case 44:
                  {
                  alt55=3;
                  }
                  break;
              default:
                  NoViableAltException nvae =
                      new NoViableAltException("", 55, 0, input);
  
                  throw nvae;
              }
  
              switch (alt55) {
                  case 1 :
                      // InternalXtext.g:2419:6: lv_operator_3_1= '+='
                      {
                      lv_operator_3_1=(Token)match(input,36,FollowSets000.FOLLOW_40); 
  
                      						newLeafNode(lv_operator_3_1, grammarAccess.getAssignmentAccess().getOperatorPlusSignEqualsSignKeyword_2_0_0());
                      					
  
                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getAssignmentRule());
                      						}
                      						setWithLastConsumed(current, "operator", lv_operator_3_1, null);
                      					
  
                      }
                      break;
                  case 2 :
                      // InternalXtext.g:2430:6: lv_operator_3_2= '='
                      {
                      lv_operator_3_2=(Token)match(input,35,FollowSets000.FOLLOW_40); 
  
                      						newLeafNode(lv_operator_3_2, grammarAccess.getAssignmentAccess().getOperatorEqualsSignKeyword_2_0_1());
                      					
  
                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getAssignmentRule());
                      						}
                      						setWithLastConsumed(current, "operator", lv_operator_3_2, null);
                      					
  
                      }
                      break;
                  case 3 :
                      // InternalXtext.g:2441:6: lv_operator_3_3= '?='
                      {
                      lv_operator_3_3=(Token)match(input,44,FollowSets000.FOLLOW_40); 
  
                      						newLeafNode(lv_operator_3_3, grammarAccess.getAssignmentAccess().getOperatorQuestionMarkEqualsSignKeyword_2_0_2());
                      					
  
                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getAssignmentRule());
                      						}
                      						setWithLastConsumed(current, "operator", lv_operator_3_3, null);
                      					
  
                      }
                      break;
  
              }
  
  
              }
  
  
              }
  
              // InternalXtext.g:2454:3: ( (lv_terminal_4_0= ruleAssignableTerminal ) )
              // InternalXtext.g:2455:4: (lv_terminal_4_0= ruleAssignableTerminal )
              {
              // InternalXtext.g:2455:4: (lv_terminal_4_0= ruleAssignableTerminal )
              // InternalXtext.g:2456:5: lv_terminal_4_0= ruleAssignableTerminal
              {
  
              					newCompositeNode(grammarAccess.getAssignmentAccess().getTerminalAssignableTerminalParserRuleCall_3_0());
              				
              pushFollow(FollowSets000.FOLLOW_2);
              lv_terminal_4_0=ruleAssignableTerminal();
  
              state._fsp--;
  
  
              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getAssignmentRule());
              					}
              					set(
              						current,
              						"terminal",
              						lv_terminal_4_0,
              						"org.eclipse.xtext.Xtext.AssignableTerminal");
              					afterParserOrEnumRuleCall();
              				
  
              }
  
  
              }
  
  
              }
  
  
              }
  
  
              	leaveRule();
  
          }
  
              catch (RecognitionException re) {
                  recover(input,re);
                  appendSkippedTokens();
              }
          finally {
          }
          return current;
      }