set_EFF ()
{
  int nvars.0;
  int D.4015;
  int D.4016;
  long unsigned int D.4017;
  unsigned int D.4018;
  unsigned int D.4019;
  char * EFF.1;
  short int * * derives.2;
  long unsigned int D.4022;
  long unsigned int D.4023;
  short int * * D.4024;
  short int D.4025;
  short int * ritem.3;
  short int * rrhs.4;
  long unsigned int D.4028;
  long unsigned int D.4029;
  short int * D.4030;
  short int D.4031;
  long unsigned int D.4032;
  long unsigned int D.4033;
  short int * D.4034;
  short int D.4035;
  int start_symbol.5;
  int D.4039;
  long unsigned int D.4040;
  long unsigned int D.4041;
  unsigned int * D.4042;
  unsigned int D.4043;
  int D.4044;
  unsigned int D.4045;
  unsigned int D.4046;
  long unsigned int D.4047;
  long unsigned int D.4048;
  int nsyms.6;
  unsigned int * EFF.7;
  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.4015 = nvars.0 + 31;
  rowsize = D.4015 / 32;
  nvars.0 = nvars;
  D.4016 = nvars.0 * rowsize;
  D.4017 = (long unsigned int) D.4016;
  D.4018 = (unsigned int) D.4017;
  D.4019 = D.4018 * 4;
  EFF.1 = allocate (D.4019);
  EFF = EFF.1;
  row = EFF;
  i = start_symbol;
  goto <D.3947>;
  <D.3946>:
  derives.2 = derives;
  D.4022 = (long unsigned int) i;
  D.4023 = D.4022 * 8;
  D.4024 = derives.2 + D.4023;
  sp = *D.4024;
  D.4025 = *sp;
  rule = (int) D.4025;
  goto <D.3944>;
  <D.3943>:
  ritem.3 = ritem;
  rrhs.4 = rrhs;
  D.4028 = (long unsigned int) rule;
  D.4029 = D.4028 * 2;
  D.4030 = rrhs.4 + D.4029;
  D.4031 = *D.4030;
  D.4032 = (long unsigned int) D.4031;
  D.4033 = D.4032 * 2;
  D.4034 = ritem.3 + D.4033;
  D.4035 = *D.4034;
  symbol = (int) D.4035;
  start_symbol.5 = start_symbol;
  if (symbol >= start_symbol.5) goto <D.4037>; else goto <D.4038>;
  <D.4037>:
  start_symbol.5 = start_symbol;
  symbol = symbol - start_symbol.5;
  D.4039 = symbol >> 5;
  D.4040 = (long unsigned int) D.4039;
  D.4041 = D.4040 * 4;
  D.4042 = row + D.4041;
  D.4039 = symbol >> 5;
  D.4040 = (long unsigned int) D.4039;
  D.4041 = D.4040 * 4;
  D.4042 = row + D.4041;
  D.4043 = *D.4042;
  D.4044 = symbol & 31;
  D.4045 = 1 << D.4044;
  D.4046 = D.4043 | D.4045;
  *D.4042 = D.4046;
  <D.4038>:
  sp = sp + 2;
  D.4025 = *sp;
  rule = (int) D.4025;
  <D.3944>:
  if (rule > 0) goto <D.3943>; else goto <D.3945>;
  <D.3945>:
  D.4047 = (long unsigned int) rowsize;
  D.4048 = D.4047 * 4;
  row = row + D.4048;
  i = i + 1;
  <D.3947>:
  nsyms.6 = nsyms;
  if (i < nsyms.6) goto <D.3946>; else goto <D.3948>;
  <D.3948>:
  nvars.0 = nvars;
  EFF.7 = EFF;
  reflexive_transitive_closure (EFF.7, nvars.0);
}


set_first_derives ()
{
  int nrules.8;
  int D.4052;
  int nvars.9;
  int D.4054;
  int D.4055;
  long unsigned int D.4056;
  unsigned int D.4057;
  unsigned int D.4058;
  char * D.4059;
  int ntokens.10;
  int D.4061;
  long unsigned int D.4062;
  long unsigned int D.4063;
  sizetype D.4064;
  unsigned int * first_derives.11;
  unsigned int * first_derives.12;
  unsigned int * EFF.13;
  int D.4068;
  int D.4069;
  long unsigned int D.4070;
  long unsigned int D.4071;
  unsigned int * vrow.14;
  int k.15;
  int D.4076;
  unsigned int D.4077;
  unsigned int D.4078;
  short int * * derives.16;
  long unsigned int D.4082;
  long unsigned int D.4083;
  short int * * D.4084;
  int D.4085;
  long unsigned int D.4086;
  long unsigned int D.4087;
  unsigned int * D.4088;
  unsigned int D.4089;
  int D.4090;
  unsigned int D.4091;
  unsigned int D.4092;
  short int * rp.17;
  short int D.4094;
  int nsyms.18;
  long unsigned int D.4096;
  long unsigned int D.4097;
  long unsigned int D.4098;
  long unsigned int D.4099;
  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.8 = nrules;
  D.4052 = nrules.8 + 31;
  rulesetsize = D.4052 / 32;
  nvars.9 = nvars;
  D.4054 = nvars.9 + 31;
  varsetsize = D.4054 / 32;
  nvars.9 = nvars;
  D.4055 = nvars.9 * rulesetsize;
  D.4056 = (long unsigned int) D.4055;
  D.4057 = (unsigned int) D.4056;
  D.4058 = D.4057 * 4;
  D.4059 = allocate (D.4058);
  ntokens.10 = ntokens;
  D.4061 = ntokens.10 * rulesetsize;
  D.4062 = (long unsigned int) D.4061;
  D.4063 = D.4062 * 4;
  D.4064 = -D.4063;
  first_derives.11 = D.4059 + D.4064;
  first_derives = first_derives.11;
  set_EFF ();
  first_derives.12 = first_derives;
  ntokens.10 = ntokens;
  D.4061 = ntokens.10 * rulesetsize;
  D.4062 = (long unsigned int) D.4061;
  D.4063 = D.4062 * 4;
  rrow = first_derives.12 + D.4063;
  i = start_symbol;
  goto <D.3970>;
  <D.3969>:
  EFF.13 = EFF;
  ntokens.10 = ntokens;
  D.4068 = i - ntokens.10;
  D.4069 = D.4068 * varsetsize;
  D.4070 = (long unsigned int) D.4069;
  D.4071 = D.4070 * 4;
  vrow = EFF.13 + D.4071;
  k = 32;
  j = start_symbol;
  goto <D.3967>;
  <D.3966>:
  if (k > 31) goto <D.4072>; else goto <D.4073>;
  <D.4072>:
  vrow.14 = vrow;
  vrow = vrow.14 + 4;
  cword = *vrow.14;
  k = 0;
  <D.4073>:
  k.15 = (int) k;
  D.4076 = 1 << k.15;
  D.4077 = (unsigned int) D.4076;
  D.4078 = D.4077 & cword;
  if (D.4078 != 0) goto <D.4079>; else goto <D.4080>;
  <D.4079>:
  derives.16 = derives;
  D.4082 = (long unsigned int) j;
  D.4083 = D.4082 * 8;
  D.4084 = derives.16 + D.4083;
  rp = *D.4084;
  goto <D.3964>;
  <D.3963>:
  D.4085 = rule >> 5;
  D.4086 = (long unsigned int) D.4085;
  D.4087 = D.4086 * 4;
  D.4088 = rrow + D.4087;
  D.4085 = rule >> 5;
  D.4086 = (long unsigned int) D.4085;
  D.4087 = D.4086 * 4;
  D.4088 = rrow + D.4087;
  D.4089 = *D.4088;
  D.4090 = rule & 31;
  D.4091 = 1 << D.4090;
  D.4092 = D.4089 | D.4091;
  *D.4088 = D.4092;
  <D.3964>:
  rp.17 = rp;
  rp = rp.17 + 2;
  D.4094 = *rp.17;
  rule = (int) D.4094;
  if (rule >= 0) goto <D.3963>; else goto <D.3965>;
  <D.3965>:
  <D.4080>:
  k = k + 1;
  j = j + 1;
  <D.3967>:
  nsyms.18 = nsyms;
  if (j < nsyms.18) goto <D.3966>; else goto <D.3968>;
  <D.3968>:
  D.4096 = (long unsigned int) varsetsize;
  D.4097 = D.4096 * 4;
  vrow = vrow + D.4097;
  D.4098 = (long unsigned int) rulesetsize;
  D.4099 = D.4098 * 4;
  rrow = rrow + D.4099;
  i = i + 1;
  <D.3970>:
  nsyms.18 = nsyms;
  if (i < nsyms.18) goto <D.3969>; else goto <D.3971>;
  <D.3971>:
  EFF.13 = EFF;
  free (EFF.13);
}


closure (short int * nucleus, int n)
{
  int nrules.19;
  int D.4101;
  unsigned int * ruleset.20;
  long unsigned int D.4103;
  long unsigned int D.4104;
  long unsigned int D.4105;
  long unsigned int D.4106;
  short int * ritem.21;
  short int D.4108;
  long unsigned int D.4109;
  long unsigned int D.4110;
  short int * D.4111;
  short int D.4112;
  int start_symbol.22;
  unsigned int * first_derives.23;
  int D.4117;
  long unsigned int D.4118;
  long unsigned int D.4119;
  unsigned int * dsp.24;
  unsigned int D.4121;
  unsigned int * rsp.25;
  unsigned int * rsp.26;
  unsigned int D.4124;
  unsigned int D.4125;
  short int * itemset.27;
  int i.28;
  int D.4130;
  unsigned int D.4131;
  unsigned int D.4132;
  short int * rrhs.29;
  unsigned int ruleno.30;
  unsigned int D.4137;
  long unsigned int D.4138;
  long unsigned int D.4139;
  short int * D.4140;
  short int D.4141;
  short int * itemsetend.31;
  short int * itemsetend.32;
  short int * itemsetend.33;
  short int * csp.34;
  short int D.4146;
  int D.4148;
  short int * itemsetend.35;
  short int * itemsetend.36;
  short int D.4151;
  short int * itemsetend.37;
  short int * itemsetend.38;
  short int * csp.39;
  short int D.4156;
  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.19 = nrules;
  D.4101 = nrules.19 + 31;
  rulesetsize = D.4101 / 32;
  rsp = ruleset;
  ruleset.20 = ruleset;
  D.4103 = (long unsigned int) rulesetsize;
  D.4104 = D.4103 * 4;
  rsend = ruleset.20 + D.4104;
  rsp = ruleset;
  goto <D.3988>;
  <D.3987>:
  *rsp = 0;
  rsp = rsp + 4;
  <D.3988>:
  if (rsp < rsend) goto <D.3987>; else goto <D.3989>;
  <D.3989>:
  D.4105 = (long unsigned int) n;
  D.4106 = D.4105 * 2;
  csend = nucleus + D.4106;
  csp = nucleus;
  goto <D.3994>;
  <D.3993>:
  ritem.21 = ritem;
  D.4108 = *csp;
  D.4109 = (long unsigned int) D.4108;
  D.4110 = D.4109 * 2;
  D.4111 = ritem.21 + D.4110;
  D.4112 = *D.4111;
  symbol = (int) D.4112;
  start_symbol.22 = start_symbol;
  if (symbol >= start_symbol.22) goto <D.4114>; else goto <D.4115>;
  <D.4114>:
  first_derives.23 = first_derives;
  D.4117 = symbol * rulesetsize;
  D.4118 = (long unsigned int) D.4117;
  D.4119 = D.4118 * 4;
  dsp = first_derives.23 + D.4119;
  rsp = ruleset;
  goto <D.3991>;
  <D.3990>:
  dsp.24 = dsp;
  dsp = dsp.24 + 4;
  D.4121 = *dsp.24;
  rsp.25 = rsp;
  rsp = rsp.25 + 4;
  rsp.26 = rsp.25;
  D.4124 = *rsp.26;
  D.4125 = D.4124 | D.4121;
  *rsp.26 = D.4125;
  <D.3991>:
  if (rsp < rsend) goto <D.3990>; else goto <D.3992>;
  <D.3992>:
  <D.4115>:
  csp = csp + 2;
  <D.3994>:
  if (csp < csend) goto <D.3993>; else goto <D.3995>;
  <D.3995>:
  ruleno = 0;
  itemset.27 = itemset;
  itemsetend = itemset.27;
  csp = nucleus;
  rsp = ruleset;
  goto <D.4006>;
  <D.4005>:
  word = *rsp;
  if (word != 0) goto <D.4127>; else goto <D.4128>;
  <D.4127>:
  i = 0;
  goto <D.4003>;
  <D.4002>:
  i.28 = (int) i;
  D.4130 = 1 << i.28;
  D.4131 = (unsigned int) D.4130;
  D.4132 = D.4131 & word;
  if (D.4132 != 0) goto <D.4133>; else goto <D.4134>;
  <D.4133>:
  rrhs.29 = rrhs;
  ruleno.30 = (unsigned int) ruleno;
  D.4137 = ruleno.30 + i;
  D.4138 = (long unsigned int) D.4137;
  D.4139 = D.4138 * 2;
  D.4140 = rrhs.29 + D.4139;
  D.4141 = *D.4140;
  itemno = (int) D.4141;
  goto <D.3997>;
  <D.3996>:
  itemsetend.31 = itemsetend;
  itemsetend.32 = itemsetend.31;
  itemsetend.33 = itemsetend.32 + 2;
  itemsetend = itemsetend.33;
  csp.34 = csp;
  csp = csp.34 + 2;
  D.4146 = *csp.34;
  *itemsetend.32 = D.4146;
  <D.3997>:
  if (csp < csend) goto <D.4147>; else goto <D.3998>;
  <D.4147>:
  D.4108 = *csp;
  D.4148 = (int) D.4108;
  if (D.4148 < itemno) goto <D.3996>; else goto <D.3998>;
  <D.3998>:
  itemsetend.31 = itemsetend;
  itemsetend.35 = itemsetend.31;
  itemsetend.36 = itemsetend.35 + 2;
  itemsetend = itemsetend.36;
  D.4151 = (short int) itemno;
  *itemsetend.35 = D.4151;
  goto <D.4000>;
  <D.3999>:
  csp = csp + 2;
  <D.4000>:
  if (csp < csend) goto <D.4152>; else goto <D.4001>;
  <D.4152>:
  D.4108 = *csp;
  D.4148 = (int) D.4108;
  if (D.4148 == itemno) goto <D.3999>; else goto <D.4001>;
  <D.4001>:
  <D.4134>:
  i = i + 1;
  <D.4003>:
  if (i <= 31) goto <D.4002>; else goto <D.4004>;
  <D.4004>:
  <D.4128>:
  ruleno = ruleno + 32;
  rsp = rsp + 4;
  <D.4006>:
  if (rsp < rsend) goto <D.4005>; else goto <D.4007>;
  <D.4007>:
  goto <D.4009>;
  <D.4008>:
  itemsetend.31 = itemsetend;
  itemsetend.37 = itemsetend.31;
  itemsetend.38 = itemsetend.37 + 2;
  itemsetend = itemsetend.38;
  csp.39 = csp;
  csp = csp.39 + 2;
  D.4156 = *csp.39;
  *itemsetend.37 = D.4156;
  <D.4009>:
  if (csp < csend) goto <D.4008>; else goto <D.4010>;
  <D.4010>:
}


finalize_closure ()
{
  short int * itemset.40;
  unsigned int * ruleset.41;
  unsigned int * first_derives.42;
  int nrules.43;
  int D.4161;
  int D.4162;
  int ntokens.44;
  int D.4164;
  long unsigned int D.4165;
  long unsigned int D.4166;
  void * D.4167;

  itemset.40 = itemset;
  free (itemset.40);
  ruleset.41 = ruleset;
  free (ruleset.41);
  first_derives.42 = first_derives;
  nrules.43 = nrules;
  D.4161 = nrules.43 + 31;
  D.4162 = D.4161 / 32;
  ntokens.44 = ntokens;
  D.4164 = D.4162 * ntokens.44;
  D.4165 = (long unsigned int) D.4164;
  D.4166 = D.4165 * 4;
  D.4167 = first_derives.42 + D.4166;
  free (D.4167);
}


