protected int assignGroupIds(int start) {
   int nextId = start;
   for (PatternExpr pattern : patterns) {
     nextId = pattern.assignGroupIds(nextId);
   }
   return nextId;
 }
 protected int assignGroupIds(int start) {
   int nextId = start;
   // assign group ids of child expressions
   for (PatternExpr pattern : patterns) {
     nextId = pattern.assignGroupIds(nextId);
   }
   return nextId;
 }
 protected int assignGroupIds(int start) {
   int nextId = start;
   if (capture) {
     captureGroupId = nextId;
     nextId++;
   }
   return pattern.assignGroupIds(nextId);
 }
 protected int assignGroupIds(int start) {
   return pattern.assignGroupIds(start);
 }