dfa->nodes[new_idx].opr.idx = cur_nsub;
dfa->nodes[left_par->node_idx].opr.idx = cur_nsub;
parse_sub_exp (regexp, preg, token, syntax, nest, err)     re_string_t *regexp;     regex_t *preg;     re_token_t *token;     reg_syntax_t syntax;     int nest;     reg_errcode_t *err;{  re_dfa_t *dfa = (re_dfa_t *) preg->buffer;  bin_tree_t *tree, *left_par, *right_par;  size_t cur_nsub;  int new_idx;  cur_nsub = preg->re_nsub++;  if (dfa->subexps_alloc < preg->re_nsub)    {      re_subexp_t *new_array;      dfa->subexps_alloc *= 2;      new_array = re_realloc (dfa->subexps, re_subexp_t, dfa->subexps_alloc);      if (BE (new_array == NULL, 0))	{	  dfa->subexps_alloc /= 2;	  *err = REG_ESPACE;	  return NULL;	}      dfa->subexps = new_array;    }  dfa->subexps[cur_nsub].start = dfa->nodes_len;  dfa->subexps[cur_nsub].end = -1;  new_idx = re_dfa_add_node (dfa, *token, 0);  left_par = create_tree (NULL, NULL, 0, new_idx);  if (BE (new_idx == -1 || left_par == NULL, 0))    {      *err = REG_ESPACE;      return NULL;    }  dfa->nodes[new_idx].opr.idx = cur_nsub;  *token = fetch_token (regexp, syntax | RE_CARET_ANCHORS_HERE);  /* The subexpression may be a null string.  */  if (token->type == OP_CLOSE_SUBEXP)    tree = NULL;  else    {      tree = parse_reg_exp (regexp, preg, token, syntax, nest, err);      if (BE (*err != REG_NOERROR && tree == NULL, 0))	return NULL;    }  if (BE (token->type != OP_CLOSE_SUBEXP, 0))    {      free_bin_tree (tree);      *err = REG_EPAREN;      return NULL;    }  new_idx = re_dfa_add_node (dfa, *token, 0);  dfa->subexps[cur_nsub].end = dfa->nodes_len;  right_par = create_tree (NULL, NULL, 0, new_idx);  tree = ((tree == NULL) ? right_par	  : create_tree (tree, right_par, CONCAT, 0));  tree = create_tree (left_par, tree, CONCAT, 0);  if (BE (new_idx == -1 || right_par == NULL || tree == NULL, 0))    {      *err = REG_ESPACE;      return NULL;    }  dfa->nodes[new_idx].opr.idx = cur_nsub;  return tree;}