set_EFF ()
{
  int nvars.0;
  int D.3396;
  int D.3397;
  unsigned int D.3398;
  unsigned int D.3399;
  char * EFF.1;
  short int * * derives.2;
  unsigned int i.3;
  unsigned int D.3403;
  short int * * D.3404;
  short int D.3405;
  short int * ritem.4;
  short int * rrhs.5;
  unsigned int rule.6;
  unsigned int D.3409;
  short int * D.3410;
  short int D.3411;
  unsigned int D.3412;
  unsigned int D.3413;
  short int * D.3414;
  short int D.3415;
  int start_symbol.7;
  int D.3419;
  unsigned int D.3420;
  unsigned int D.3421;
  unsigned int * D.3422;
  unsigned int D.3423;
  int D.3424;
  unsigned int D.3425;
  unsigned int D.3426;
  unsigned int rowsize.8;
  unsigned int D.3428;
  int nsyms.9;
  unsigned int * EFF.10;
  register unsigned int * row;
  register int symbol;
  register short int * sp;
  register int rowsize;
  register int i;
  register int rule;
  extern int reflexive_transitive_closure ();

  nvars.0 = nvars;
  D.3396 = nvars.0 + 31;
  rowsize = D.3396 / 32;
  nvars.0 = nvars;
  D.3397 = nvars.0 * rowsize;
  D.3398 = (unsigned int) D.3397;
  D.3399 = D.3398 * 4;
  EFF.1 = allocate (D.3399);
  EFF = EFF.1;
  row = EFF;
  i = start_symbol;
  goto <D.3328>;
  <D.3327>:
  derives.2 = derives;
  i.3 = (unsigned int) i;
  D.3403 = i.3 * 4;
  D.3404 = derives.2 + D.3403;
  sp = *D.3404;
  D.3405 = *sp;
  rule = (int) D.3405;
  goto <D.3325>;
  <D.3324>:
  ritem.4 = ritem;
  rrhs.5 = rrhs;
  rule.6 = (unsigned int) rule;
  D.3409 = rule.6 * 2;
  D.3410 = rrhs.5 + D.3409;
  D.3411 = *D.3410;
  D.3412 = (unsigned int) D.3411;
  D.3413 = D.3412 * 2;
  D.3414 = ritem.4 + D.3413;
  D.3415 = *D.3414;
  symbol = (int) D.3415;
  start_symbol.7 = start_symbol;
  if (symbol >= start_symbol.7) goto <D.3417>; else goto <D.3418>;
  <D.3417>:
  start_symbol.7 = start_symbol;
  symbol = symbol - start_symbol.7;
  D.3419 = symbol >> 5;
  D.3420 = (unsigned int) D.3419;
  D.3421 = D.3420 * 4;
  D.3422 = row + D.3421;
  D.3419 = symbol >> 5;
  D.3420 = (unsigned int) D.3419;
  D.3421 = D.3420 * 4;
  D.3422 = row + D.3421;
  D.3423 = *D.3422;
  D.3424 = symbol & 31;
  D.3425 = 1 << D.3424;
  D.3426 = D.3423 | D.3425;
  *D.3422 = D.3426;
  <D.3418>:
  sp = sp + 2;
  D.3405 = *sp;
  rule = (int) D.3405;
  <D.3325>:
  if (rule > 0) goto <D.3324>; else goto <D.3326>;
  <D.3326>:
  rowsize.8 = (unsigned int) rowsize;
  D.3428 = rowsize.8 * 4;
  row = row + D.3428;
  i = i + 1;
  <D.3328>:
  nsyms.9 = nsyms;
  if (i < nsyms.9) goto <D.3327>; else goto <D.3329>;
  <D.3329>:
  nvars.0 = nvars;
  EFF.10 = EFF;
  reflexive_transitive_closure (EFF.10, nvars.0);
}


set_first_derives ()
{
  int nrules.11;
  int D.3432;
  int nvars.12;
  int D.3434;
  int D.3435;
  unsigned int D.3436;
  unsigned int D.3437;
  char * D.3438;
  int ntokens.13;
  int D.3440;
  unsigned int D.3441;
  unsigned int D.3442;
  sizetype D.3443;
  unsigned int * first_derives.14;
  unsigned int * first_derives.15;
  unsigned int * EFF.16;
  int D.3447;
  int D.3448;
  unsigned int D.3449;
  unsigned int D.3450;
  unsigned int * vrow.17;
  int k.18;
  int D.3455;
  unsigned int D.3456;
  unsigned int D.3457;
  short int * * derives.19;
  unsigned int j.20;
  unsigned int D.3462;
  short int * * D.3463;
  int D.3464;
  unsigned int D.3465;
  unsigned int D.3466;
  unsigned int * D.3467;
  unsigned int D.3468;
  int D.3469;
  unsigned int D.3470;
  unsigned int D.3471;
  short int * rp.21;
  short int D.3473;
  int nsyms.22;
  unsigned int varsetsize.23;
  unsigned int D.3476;
  unsigned int rulesetsize.24;
  unsigned int D.3478;
  register unsigned int * rrow;
  register unsigned int * vrow;
  register int j;
  register unsigned int k;
  register unsigned int cword;
  register short int * rp;
  int rule;
  int i;
  int rulesetsize;
  int varsetsize;

  nrules.11 = nrules;
  D.3432 = nrules.11 + 31;
  rulesetsize = D.3432 / 32;
  nvars.12 = nvars;
  D.3434 = nvars.12 + 31;
  varsetsize = D.3434 / 32;
  nvars.12 = nvars;
  D.3435 = nvars.12 * rulesetsize;
  D.3436 = (unsigned int) D.3435;
  D.3437 = D.3436 * 4;
  D.3438 = allocate (D.3437);
  ntokens.13 = ntokens;
  D.3440 = ntokens.13 * rulesetsize;
  D.3441 = (unsigned int) D.3440;
  D.3442 = D.3441 * 4;
  D.3443 = -D.3442;
  first_derives.14 = D.3438 + D.3443;
  first_derives = first_derives.14;
  set_EFF ();
  first_derives.15 = first_derives;
  ntokens.13 = ntokens;
  D.3440 = ntokens.13 * rulesetsize;
  D.3441 = (unsigned int) D.3440;
  D.3442 = D.3441 * 4;
  rrow = first_derives.15 + D.3442;
  i = start_symbol;
  goto <D.3351>;
  <D.3350>:
  EFF.16 = EFF;
  ntokens.13 = ntokens;
  D.3447 = i - ntokens.13;
  D.3448 = D.3447 * varsetsize;
  D.3449 = (unsigned int) D.3448;
  D.3450 = D.3449 * 4;
  vrow = EFF.16 + D.3450;
  k = 32;
  j = start_symbol;
  goto <D.3348>;
  <D.3347>:
  if (k > 31) goto <D.3451>; else goto <D.3452>;
  <D.3451>:
  vrow.17 = vrow;
  vrow = vrow.17 + 4;
  cword = *vrow.17;
  k = 0;
  <D.3452>:
  k.18 = (int) k;
  D.3455 = 1 << k.18;
  D.3456 = (unsigned int) D.3455;
  D.3457 = D.3456 & cword;
  if (D.3457 != 0) goto <D.3458>; else goto <D.3459>;
  <D.3458>:
  derives.19 = derives;
  j.20 = (unsigned int) j;
  D.3462 = j.20 * 4;
  D.3463 = derives.19 + D.3462;
  rp = *D.3463;
  goto <D.3345>;
  <D.3344>:
  D.3464 = rule >> 5;
  D.3465 = (unsigned int) D.3464;
  D.3466 = D.3465 * 4;
  D.3467 = rrow + D.3466;
  D.3464 = rule >> 5;
  D.3465 = (unsigned int) D.3464;
  D.3466 = D.3465 * 4;
  D.3467 = rrow + D.3466;
  D.3468 = *D.3467;
  D.3469 = rule & 31;
  D.3470 = 1 << D.3469;
  D.3471 = D.3468 | D.3470;
  *D.3467 = D.3471;
  <D.3345>:
  rp.21 = rp;
  rp = rp.21 + 2;
  D.3473 = *rp.21;
  rule = (int) D.3473;
  if (rule >= 0) goto <D.3344>; else goto <D.3346>;
  <D.3346>:
  <D.3459>:
  k = k + 1;
  j = j + 1;
  <D.3348>:
  nsyms.22 = nsyms;
  if (j < nsyms.22) goto <D.3347>; else goto <D.3349>;
  <D.3349>:
  varsetsize.23 = (unsigned int) varsetsize;
  D.3476 = varsetsize.23 * 4;
  vrow = vrow + D.3476;
  rulesetsize.24 = (unsigned int) rulesetsize;
  D.3478 = rulesetsize.24 * 4;
  rrow = rrow + D.3478;
  i = i + 1;
  <D.3351>:
  nsyms.22 = nsyms;
  if (i < nsyms.22) goto <D.3350>; else goto <D.3352>;
  <D.3352>:
  EFF.16 = EFF;
  free (EFF.16);
}


closure (short int * nucleus, int n)
{
  int nrules.25;
  int D.3480;
  unsigned int * ruleset.26;
  unsigned int rulesetsize.27;
  unsigned int D.3483;
  unsigned int n.28;
  unsigned int D.3485;
  short int * ritem.29;
  short int D.3487;
  unsigned int D.3488;
  unsigned int D.3489;
  short int * D.3490;
  short int D.3491;
  int start_symbol.30;
  unsigned int * first_derives.31;
  int D.3496;
  unsigned int D.3497;
  unsigned int D.3498;
  unsigned int * dsp.32;
  unsigned int D.3500;
  unsigned int * rsp.33;
  unsigned int * rsp.34;
  unsigned int D.3503;
  unsigned int D.3504;
  short int * itemset.35;
  int i.36;
  int D.3509;
  unsigned int D.3510;
  unsigned int D.3511;
  short int * rrhs.37;
  unsigned int ruleno.38;
  unsigned int D.3516;
  unsigned int D.3517;
  short int * D.3518;
  short int D.3519;
  short int * itemsetend.39;
  short int * itemsetend.40;
  short int * itemsetend.41;
  short int * csp.42;
  short int D.3524;
  int D.3526;
  short int * itemsetend.43;
  short int * itemsetend.44;
  short int D.3529;
  short int * itemsetend.45;
  short int * itemsetend.46;
  short int * csp.47;
  short int D.3534;
  register int ruleno;
  register unsigned int word;
  register unsigned int i;
  register short int * csp;
  register unsigned int * dsp;
  register unsigned int * rsp;
  register int rulesetsize;
  short int * csend;
  unsigned int * rsend;
  int symbol;
  int itemno;

  nrules.25 = nrules;
  D.3480 = nrules.25 + 31;
  rulesetsize = D.3480 / 32;
  rsp = ruleset;
  ruleset.26 = ruleset;
  rulesetsize.27 = (unsigned int) rulesetsize;
  D.3483 = rulesetsize.27 * 4;
  rsend = ruleset.26 + D.3483;
  rsp = ruleset;
  goto <D.3369>;
  <D.3368>:
  *rsp = 0;
  rsp = rsp + 4;
  <D.3369>:
  if (rsp < rsend) goto <D.3368>; else goto <D.3370>;
  <D.3370>:
  n.28 = (unsigned int) n;
  D.3485 = n.28 * 2;
  csend = nucleus + D.3485;
  csp = nucleus;
  goto <D.3375>;
  <D.3374>:
  ritem.29 = ritem;
  D.3487 = *csp;
  D.3488 = (unsigned int) D.3487;
  D.3489 = D.3488 * 2;
  D.3490 = ritem.29 + D.3489;
  D.3491 = *D.3490;
  symbol = (int) D.3491;
  start_symbol.30 = start_symbol;
  if (symbol >= start_symbol.30) goto <D.3493>; else goto <D.3494>;
  <D.3493>:
  first_derives.31 = first_derives;
  D.3496 = symbol * rulesetsize;
  D.3497 = (unsigned int) D.3496;
  D.3498 = D.3497 * 4;
  dsp = first_derives.31 + D.3498;
  rsp = ruleset;
  goto <D.3372>;
  <D.3371>:
  dsp.32 = dsp;
  dsp = dsp.32 + 4;
  D.3500 = *dsp.32;
  rsp.33 = rsp;
  rsp = rsp.33 + 4;
  rsp.34 = rsp.33;
  D.3503 = *rsp.34;
  D.3504 = D.3503 | D.3500;
  *rsp.34 = D.3504;
  <D.3372>:
  if (rsp < rsend) goto <D.3371>; else goto <D.3373>;
  <D.3373>:
  <D.3494>:
  csp = csp + 2;
  <D.3375>:
  if (csp < csend) goto <D.3374>; else goto <D.3376>;
  <D.3376>:
  ruleno = 0;
  itemset.35 = itemset;
  itemsetend = itemset.35;
  csp = nucleus;
  rsp = ruleset;
  goto <D.3387>;
  <D.3386>:
  word = *rsp;
  if (word != 0) goto <D.3506>; else goto <D.3507>;
  <D.3506>:
  i = 0;
  goto <D.3384>;
  <D.3383>:
  i.36 = (int) i;
  D.3509 = 1 << i.36;
  D.3510 = (unsigned int) D.3509;
  D.3511 = D.3510 & word;
  if (D.3511 != 0) goto <D.3512>; else goto <D.3513>;
  <D.3512>:
  rrhs.37 = rrhs;
  ruleno.38 = (unsigned int) ruleno;
  D.3516 = ruleno.38 + i;
  D.3517 = D.3516 * 2;
  D.3518 = rrhs.37 + D.3517;
  D.3519 = *D.3518;
  itemno = (int) D.3519;
  goto <D.3378>;
  <D.3377>:
  itemsetend.39 = itemsetend;
  itemsetend.40 = itemsetend.39;
  itemsetend.41 = itemsetend.40 + 2;
  itemsetend = itemsetend.41;
  csp.42 = csp;
  csp = csp.42 + 2;
  D.3524 = *csp.42;
  *itemsetend.40 = D.3524;
  <D.3378>:
  if (csp < csend) goto <D.3525>; else goto <D.3379>;
  <D.3525>:
  D.3487 = *csp;
  D.3526 = (int) D.3487;
  if (D.3526 < itemno) goto <D.3377>; else goto <D.3379>;
  <D.3379>:
  itemsetend.39 = itemsetend;
  itemsetend.43 = itemsetend.39;
  itemsetend.44 = itemsetend.43 + 2;
  itemsetend = itemsetend.44;
  D.3529 = (short int) itemno;
  *itemsetend.43 = D.3529;
  goto <D.3381>;
  <D.3380>:
  csp = csp + 2;
  <D.3381>:
  if (csp < csend) goto <D.3530>; else goto <D.3382>;
  <D.3530>:
  D.3487 = *csp;
  D.3526 = (int) D.3487;
  if (D.3526 == itemno) goto <D.3380>; else goto <D.3382>;
  <D.3382>:
  <D.3513>:
  i = i + 1;
  <D.3384>:
  if (i <= 31) goto <D.3383>; else goto <D.3385>;
  <D.3385>:
  <D.3507>:
  ruleno = ruleno + 32;
  rsp = rsp + 4;
  <D.3387>:
  if (rsp < rsend) goto <D.3386>; else goto <D.3388>;
  <D.3388>:
  goto <D.3390>;
  <D.3389>:
  itemsetend.39 = itemsetend;
  itemsetend.45 = itemsetend.39;
  itemsetend.46 = itemsetend.45 + 2;
  itemsetend = itemsetend.46;
  csp.47 = csp;
  csp = csp.47 + 2;
  D.3534 = *csp.47;
  *itemsetend.45 = D.3534;
  <D.3390>:
  if (csp < csend) goto <D.3389>; else goto <D.3391>;
  <D.3391>:
}


finalize_closure ()
{
  short int * itemset.48;
  unsigned int * ruleset.49;
  unsigned int * first_derives.50;
  int nrules.51;
  int D.3539;
  int D.3540;
  int ntokens.52;
  int D.3542;
  unsigned int D.3543;
  unsigned int D.3544;
  void * D.3545;

  itemset.48 = itemset;
  free (itemset.48);
  ruleset.49 = ruleset;
  free (ruleset.49);
  first_derives.50 = first_derives;
  nrules.51 = nrules;
  D.3539 = nrules.51 + 31;
  D.3540 = D.3539 / 32;
  ntokens.52 = ntokens;
  D.3542 = D.3540 * ntokens.52;
  D.3543 = (unsigned int) D.3542;
  D.3544 = D.3543 * 4;
  D.3545 = first_derives.50 + D.3544;
  free (D.3545);
}


