docs: public final EObject ruleGroup() throws RecognitionException {
          EObject current = null;
  
          EObject this_AbstractToken_0 = null;
  
          EObject lv_elements_2_0 = null;
  
  
  
          	enterRule();
  
          try {
              // InternalXtext.g:1192:2: ( (this_AbstractToken_0= ruleAbstractToken ( () ( (lv_elements_2_0= ruleAbstractToken ) )+ )? ) )
              // InternalXtext.g:1193:2: (this_AbstractToken_0= ruleAbstractToken ( () ( (lv_elements_2_0= ruleAbstractToken ) )+ )? )
              {
              // InternalXtext.g:1193:2: (this_AbstractToken_0= ruleAbstractToken ( () ( (lv_elements_2_0= ruleAbstractToken ) )+ )? )
              // InternalXtext.g:1194:3: this_AbstractToken_0= ruleAbstractToken ( () ( (lv_elements_2_0= ruleAbstractToken ) )+ )?
              {
  
              			newCompositeNode(grammarAccess.getGroupAccess().getAbstractTokenParserRuleCall_0());
              		
              pushFollow(FollowSets000.FOLLOW_29);
              this_AbstractToken_0=ruleAbstractToken();
  
              state._fsp--;
  
  
              			current = this_AbstractToken_0;
              			afterParserOrEnumRuleCall();
              		
              // InternalXtext.g:1202:3: ( () ( (lv_elements_2_0= ruleAbstractToken ) )+ )?
              int alt32=2;
              int LA32_0 = input.LA(1);
  
              if ( ((LA32_0>=RULE_STRING && LA32_0<=RULE_ID)||LA32_0==15||LA32_0==34||(LA32_0>=39 && LA32_0<=40)||(LA32_0>=42 && LA32_0<=43)) ) {
                  alt32=1;
              }
              switch (alt32) {
                  case 1 :
                      // InternalXtext.g:1203:4: () ( (lv_elements_2_0= ruleAbstractToken ) )+
                      {
                      // InternalXtext.g:1203:4: ()
                      // InternalXtext.g:1204:5: 
                      {
  
                      					current = forceCreateModelElementAndAdd(
                      						grammarAccess.getGroupAccess().getGroupElementsAction_1_0(),
                      						current);
                      				
  
                      }
  
                      // InternalXtext.g:1210:4: ( (lv_elements_2_0= ruleAbstractToken ) )+
                      int cnt31=0;
                      loop31:
                      do {
                          int alt31=2;
                          int LA31_0 = input.LA(1);
  
                          if ( ((LA31_0>=RULE_STRING && LA31_0<=RULE_ID)||LA31_0==15||LA31_0==34||(LA31_0>=39 && LA31_0<=40)||(LA31_0>=42 && LA31_0<=43)) ) {
                              alt31=1;
                          }
  
  
                          switch (alt31) {
                      	case 1 :
                      	    // InternalXtext.g:1211:5: (lv_elements_2_0= ruleAbstractToken )
                      	    {
                      	    // InternalXtext.g:1211:5: (lv_elements_2_0= ruleAbstractToken )
                      	    // InternalXtext.g:1212:6: lv_elements_2_0= ruleAbstractToken
                      	    {
  
                      	    						newCompositeNode(grammarAccess.getGroupAccess().getElementsAbstractTokenParserRuleCall_1_1_0());
                      	    					
                      	    pushFollow(FollowSets000.FOLLOW_29);
                      	    lv_elements_2_0=ruleAbstractToken();
  
                      	    state._fsp--;
  
  
                      	    						if (current==null) {
                      	    							current = createModelElementForParent(grammarAccess.getGroupRule());
                      	    						}
                      	    						add(
                      	    							current,
                      	    							"elements",
                      	    							lv_elements_2_0,
                      	    							"org.eclipse.xtext.Xtext.AbstractToken");
                      	    						afterParserOrEnumRuleCall();
                      	    					
  
                      	    }
  
  
                      	    }
                      	    break;
  
                      	default :
                      	    if ( cnt31 >= 1 ) break loop31;
                                  EarlyExitException eee =
                                      new EarlyExitException(31, input);
                                  throw eee;
                          }
                          cnt31++;
                      } while (true);
  
  
                      }
                      break;
  
              }
  
  
              }
  
  
              }
  
  
              	leaveRule();
  
          }
  
              catch (RecognitionException re) {
                  recover(input,re);
                  appendSkippedTokens();
              }
          finally {
          }
          return current;
      }