docs: public final EObject ruleUnorderedGroup() throws RecognitionException {
          EObject current = null;
  
          Token otherlv_2=null;
          EObject this_Group_0 = null;
  
          EObject lv_elements_3_0 = null;
  
  
  
          	enterRule();
  
          try {
              // InternalXtext.g:1131:2: ( (this_Group_0= ruleGroup ( () (otherlv_2= '&' ( (lv_elements_3_0= ruleGroup ) ) )+ )? ) )
              // InternalXtext.g:1132:2: (this_Group_0= ruleGroup ( () (otherlv_2= '&' ( (lv_elements_3_0= ruleGroup ) ) )+ )? )
              {
              // InternalXtext.g:1132:2: (this_Group_0= ruleGroup ( () (otherlv_2= '&' ( (lv_elements_3_0= ruleGroup ) ) )+ )? )
              // InternalXtext.g:1133:3: this_Group_0= ruleGroup ( () (otherlv_2= '&' ( (lv_elements_3_0= ruleGroup ) ) )+ )?
              {
  
              			newCompositeNode(grammarAccess.getUnorderedGroupAccess().getGroupParserRuleCall_0());
              		
              pushFollow(FollowSets000.FOLLOW_30);
              this_Group_0=ruleGroup();
  
              state._fsp--;
  
  
              			current = this_Group_0;
              			afterParserOrEnumRuleCall();
              		
              // InternalXtext.g:1141:3: ( () (otherlv_2= '&' ( (lv_elements_3_0= ruleGroup ) ) )+ )?
              int alt30=2;
              int LA30_0 = input.LA(1);
  
              if ( (LA30_0==31) ) {
                  alt30=1;
              }
              switch (alt30) {
                  case 1 :
                      // InternalXtext.g:1142:4: () (otherlv_2= '&' ( (lv_elements_3_0= ruleGroup ) ) )+
                      {
                      // InternalXtext.g:1142:4: ()
                      // InternalXtext.g:1143:5: 
                      {
  
                      					current = forceCreateModelElementAndAdd(
                      						grammarAccess.getUnorderedGroupAccess().getUnorderedGroupElementsAction_1_0(),
                      						current);
                      				
  
                      }
  
                      // InternalXtext.g:1149:4: (otherlv_2= '&' ( (lv_elements_3_0= ruleGroup ) ) )+
                      int cnt29=0;
                      loop29:
                      do {
                          int alt29=2;
                          int LA29_0 = input.LA(1);
  
                          if ( (LA29_0==31) ) {
                              alt29=1;
                          }
  
  
                          switch (alt29) {
                      	case 1 :
                      	    // InternalXtext.g:1150:5: otherlv_2= '&' ( (lv_elements_3_0= ruleGroup ) )
                      	    {
                      	    otherlv_2=(Token)match(input,31,FollowSets000.FOLLOW_28); 
  
                      	    					newLeafNode(otherlv_2, grammarAccess.getUnorderedGroupAccess().getAmpersandKeyword_1_1_0());
                      	    				
                      	    // InternalXtext.g:1154:5: ( (lv_elements_3_0= ruleGroup ) )
                      	    // InternalXtext.g:1155:6: (lv_elements_3_0= ruleGroup )
                      	    {
                      	    // InternalXtext.g:1155:6: (lv_elements_3_0= ruleGroup )
                      	    // InternalXtext.g:1156:7: lv_elements_3_0= ruleGroup
                      	    {
  
                      	    							newCompositeNode(grammarAccess.getUnorderedGroupAccess().getElementsGroupParserRuleCall_1_1_1_0());
                      	    						
                      	    pushFollow(FollowSets000.FOLLOW_30);
                      	    lv_elements_3_0=ruleGroup();
  
                      	    state._fsp--;
  
  
                      	    							if (current==null) {
                      	    								current = createModelElementForParent(grammarAccess.getUnorderedGroupRule());
                      	    							}
                      	    							add(
                      	    								current,
                      	    								"elements",
                      	    								lv_elements_3_0,
                      	    								"org.eclipse.xtext.Xtext.Group");
                      	    							afterParserOrEnumRuleCall();
                      	    						
  
                      	    }
  
  
                      	    }
  
  
                      	    }
                      	    break;
  
                      	default :
                      	    if ( cnt29 >= 1 ) break loop29;
                                  EarlyExitException eee =
                                      new EarlyExitException(29, input);
                                  throw eee;
                          }
                          cnt29++;
                      } while (true);
  
  
                      }
                      break;
  
              }
  
  
              }
  
  
              }
  
  
              	leaveRule();
  
          }
  
              catch (RecognitionException re) {
                  recover(input,re);
                  appendSkippedTokens();
              }
          finally {
          }
          return current;
      }