docs: public final EObject ruleTerminalGroup() throws RecognitionException {
          EObject current = null;
  
          EObject this_TerminalToken_0 = null;
  
          EObject lv_elements_2_0 = null;
  
  
  
          	enterRule();
  
          try {
              // InternalXtext.g:3073:2: ( (this_TerminalToken_0= ruleTerminalToken ( () ( (lv_elements_2_0= ruleTerminalToken ) )+ )? ) )
              // InternalXtext.g:3074:2: (this_TerminalToken_0= ruleTerminalToken ( () ( (lv_elements_2_0= ruleTerminalToken ) )+ )? )
              {
              // InternalXtext.g:3074:2: (this_TerminalToken_0= ruleTerminalToken ( () ( (lv_elements_2_0= ruleTerminalToken ) )+ )? )
              // InternalXtext.g:3075:3: this_TerminalToken_0= ruleTerminalToken ( () ( (lv_elements_2_0= ruleTerminalToken ) )+ )?
              {
  
              			newCompositeNode(grammarAccess.getTerminalGroupAccess().getTerminalTokenParserRuleCall_0());
              		
              pushFollow(FollowSets000.FOLLOW_48);
              this_TerminalToken_0=ruleTerminalToken();
  
              state._fsp--;
  
  
              			current = this_TerminalToken_0;
              			afterParserOrEnumRuleCall();
              		
              // InternalXtext.g:3083:3: ( () ( (lv_elements_2_0= ruleTerminalToken ) )+ )?
              int alt68=2;
              int LA68_0 = input.LA(1);
  
              if ( ((LA68_0>=RULE_STRING && LA68_0<=RULE_ID)||LA68_0==15||LA68_0==17||(LA68_0>=39 && LA68_0<=41)||LA68_0==43||LA68_0==48) ) {
                  alt68=1;
              }
              switch (alt68) {
                  case 1 :
                      // InternalXtext.g:3084:4: () ( (lv_elements_2_0= ruleTerminalToken ) )+
                      {
                      // InternalXtext.g:3084:4: ()
                      // InternalXtext.g:3085:5: 
                      {
  
                      					current = forceCreateModelElementAndAdd(
                      						grammarAccess.getTerminalGroupAccess().getGroupElementsAction_1_0(),
                      						current);
                      				
  
                      }
  
                      // InternalXtext.g:3091:4: ( (lv_elements_2_0= ruleTerminalToken ) )+
                      int cnt67=0;
                      loop67:
                      do {
                          int alt67=2;
                          int LA67_0 = input.LA(1);
  
                          if ( ((LA67_0>=RULE_STRING && LA67_0<=RULE_ID)||LA67_0==15||LA67_0==17||(LA67_0>=39 && LA67_0<=41)||LA67_0==43||LA67_0==48) ) {
                              alt67=1;
                          }
  
  
                          switch (alt67) {
                      	case 1 :
                      	    // InternalXtext.g:3092:5: (lv_elements_2_0= ruleTerminalToken )
                      	    {
                      	    // InternalXtext.g:3092:5: (lv_elements_2_0= ruleTerminalToken )
                      	    // InternalXtext.g:3093:6: lv_elements_2_0= ruleTerminalToken
                      	    {
  
                      	    						newCompositeNode(grammarAccess.getTerminalGroupAccess().getElementsTerminalTokenParserRuleCall_1_1_0());
                      	    					
                      	    pushFollow(FollowSets000.FOLLOW_48);
                      	    lv_elements_2_0=ruleTerminalToken();
  
                      	    state._fsp--;
  
  
                      	    						if (current==null) {
                      	    							current = createModelElementForParent(grammarAccess.getTerminalGroupRule());
                      	    						}
                      	    						add(
                      	    							current,
                      	    							"elements",
                      	    							lv_elements_2_0,
                      	    							"org.eclipse.xtext.Xtext.TerminalToken");
                      	    						afterParserOrEnumRuleCall();
                      	    					
  
                      	    }
  
  
                      	    }
                      	    break;
  
                      	default :
                      	    if ( cnt67 >= 1 ) break loop67;
                                  EarlyExitException eee =
                                      new EarlyExitException(67, input);
                                  throw eee;
                          }
                          cnt67++;
                      } while (true);
  
  
                      }
                      break;
  
              }
  
  
              }
  
  
              }
  
  
              	leaveRule();
  
          }
  
              catch (RecognitionException re) {
                  recover(input,re);
                  appendSkippedTokens();
              }
          finally {
          }
          return current;
      }