docs: public final EObject ruleAction() throws RecognitionException {
          EObject current = null;
  
          Token otherlv_0=null;
          Token otherlv_2=null;
          Token lv_operator_4_1=null;
          Token lv_operator_4_2=null;
          Token otherlv_5=null;
          Token otherlv_6=null;
          EObject lv_type_1_0 = null;
  
          AntlrDatatypeRuleToken lv_feature_3_0 = null;
  
  
  
          	enterRule();
  
          try {
              // InternalXtext.g:1359:2: ( (otherlv_0= '{' ( (lv_type_1_0= ruleTypeRef ) ) (otherlv_2= '.' ( (lv_feature_3_0= ruleValidID ) ) ( ( (lv_operator_4_1= '=' | lv_operator_4_2= '+=' ) ) ) otherlv_5= 'current' )? otherlv_6= '}' ) )
              // InternalXtext.g:1360:2: (otherlv_0= '{' ( (lv_type_1_0= ruleTypeRef ) ) (otherlv_2= '.' ( (lv_feature_3_0= ruleValidID ) ) ( ( (lv_operator_4_1= '=' | lv_operator_4_2= '+=' ) ) ) otherlv_5= 'current' )? otherlv_6= '}' )
              {
              // InternalXtext.g:1360:2: (otherlv_0= '{' ( (lv_type_1_0= ruleTypeRef ) ) (otherlv_2= '.' ( (lv_feature_3_0= ruleValidID ) ) ( ( (lv_operator_4_1= '=' | lv_operator_4_2= '+=' ) ) ) otherlv_5= 'current' )? otherlv_6= '}' )
              // InternalXtext.g:1361:3: otherlv_0= '{' ( (lv_type_1_0= ruleTypeRef ) ) (otherlv_2= '.' ( (lv_feature_3_0= ruleValidID ) ) ( ( (lv_operator_4_1= '=' | lv_operator_4_2= '+=' ) ) ) otherlv_5= 'current' )? otherlv_6= '}'
              {
              otherlv_0=(Token)match(input,34,FollowSets000.FOLLOW_13); 
  
              			newLeafNode(otherlv_0, grammarAccess.getActionAccess().getLeftCurlyBracketKeyword_0());
              		
              // InternalXtext.g:1365:3: ( (lv_type_1_0= ruleTypeRef ) )
              // InternalXtext.g:1366:4: (lv_type_1_0= ruleTypeRef )
              {
              // InternalXtext.g:1366:4: (lv_type_1_0= ruleTypeRef )
              // InternalXtext.g:1367:5: lv_type_1_0= ruleTypeRef
              {
  
              					newCompositeNode(grammarAccess.getActionAccess().getTypeTypeRefParserRuleCall_1_0());
              				
              pushFollow(FollowSets000.FOLLOW_32);
              lv_type_1_0=ruleTypeRef();
  
              state._fsp--;
  
  
              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getActionRule());
              					}
              					set(
              						current,
              						"type",
              						lv_type_1_0,
              						"org.eclipse.xtext.Xtext.TypeRef");
              					afterParserOrEnumRuleCall();
              				
  
              }
  
  
              }
  
              // InternalXtext.g:1384:3: (otherlv_2= '.' ( (lv_feature_3_0= ruleValidID ) ) ( ( (lv_operator_4_1= '=' | lv_operator_4_2= '+=' ) ) ) otherlv_5= 'current' )?
              int alt38=2;
              int LA38_0 = input.LA(1);
  
              if ( (LA38_0==17) ) {
                  alt38=1;
              }
              switch (alt38) {
                  case 1 :
                      // InternalXtext.g:1385:4: otherlv_2= '.' ( (lv_feature_3_0= ruleValidID ) ) ( ( (lv_operator_4_1= '=' | lv_operator_4_2= '+=' ) ) ) otherlv_5= 'current'
                      {
                      otherlv_2=(Token)match(input,17,FollowSets000.FOLLOW_3); 
  
                      				newLeafNode(otherlv_2, grammarAccess.getActionAccess().getFullStopKeyword_2_0());
                      			
                      // InternalXtext.g:1389:4: ( (lv_feature_3_0= ruleValidID ) )
                      // InternalXtext.g:1390:5: (lv_feature_3_0= ruleValidID )
                      {
                      // InternalXtext.g:1390:5: (lv_feature_3_0= ruleValidID )
                      // InternalXtext.g:1391:6: lv_feature_3_0= ruleValidID
                      {
  
                      						newCompositeNode(grammarAccess.getActionAccess().getFeatureValidIDParserRuleCall_2_1_0());
                      					
                      pushFollow(FollowSets000.FOLLOW_33);
                      lv_feature_3_0=ruleValidID();
  
                      state._fsp--;
  
  
                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getActionRule());
                      						}
                      						set(
                      							current,
                      							"feature",
                      							lv_feature_3_0,
                      							"org.eclipse.xtext.Xtext.ValidID");
                      						afterParserOrEnumRuleCall();
                      					
  
                      }
  
  
                      }
  
                      // InternalXtext.g:1408:4: ( ( (lv_operator_4_1= '=' | lv_operator_4_2= '+=' ) ) )
                      // InternalXtext.g:1409:5: ( (lv_operator_4_1= '=' | lv_operator_4_2= '+=' ) )
                      {
                      // InternalXtext.g:1409:5: ( (lv_operator_4_1= '=' | lv_operator_4_2= '+=' ) )
                      // InternalXtext.g:1410:6: (lv_operator_4_1= '=' | lv_operator_4_2= '+=' )
                      {
                      // InternalXtext.g:1410:6: (lv_operator_4_1= '=' | lv_operator_4_2= '+=' )
                      int alt37=2;
                      int LA37_0 = input.LA(1);
  
                      if ( (LA37_0==35) ) {
                          alt37=1;
                      }
                      else if ( (LA37_0==36) ) {
                          alt37=2;
                      }
                      else {
                          NoViableAltException nvae =
                              new NoViableAltException("", 37, 0, input);
  
                          throw nvae;
                      }
                      switch (alt37) {
                          case 1 :
                              // InternalXtext.g:1411:7: lv_operator_4_1= '='
                              {
                              lv_operator_4_1=(Token)match(input,35,FollowSets000.FOLLOW_34); 
  
                              							newLeafNode(lv_operator_4_1, grammarAccess.getActionAccess().getOperatorEqualsSignKeyword_2_2_0_0());
                              						
  
                              							if (current==null) {
                              								current = createModelElement(grammarAccess.getActionRule());
                              							}
                              							setWithLastConsumed(current, "operator", lv_operator_4_1, null);
                              						
  
                              }
                              break;
                          case 2 :
                              // InternalXtext.g:1422:7: lv_operator_4_2= '+='
                              {
                              lv_operator_4_2=(Token)match(input,36,FollowSets000.FOLLOW_34); 
  
                              							newLeafNode(lv_operator_4_2, grammarAccess.getActionAccess().getOperatorPlusSignEqualsSignKeyword_2_2_0_1());
                              						
  
                              							if (current==null) {
                              								current = createModelElement(grammarAccess.getActionRule());
                              							}
                              							setWithLastConsumed(current, "operator", lv_operator_4_2, null);
                              						
  
                              }
                              break;
  
                      }
  
  
                      }
  
  
                      }
  
                      otherlv_5=(Token)match(input,37,FollowSets000.FOLLOW_35); 
  
                      				newLeafNode(otherlv_5, grammarAccess.getActionAccess().getCurrentKeyword_2_3());
                      			
  
                      }
                      break;
  
              }
  
              otherlv_6=(Token)match(input,38,FollowSets000.FOLLOW_2); 
  
              			newLeafNode(otherlv_6, grammarAccess.getActionAccess().getRightCurlyBracketKeyword_3());
              		
  
              }
  
  
              }
  
  
              	leaveRule();
  
          }
  
              catch (RecognitionException re) {
                  recover(input,re);
                  appendSkippedTokens();
              }
          finally {
          }
          return current;
      }