size_t ritem_longest_rhs (void) { int max = 0; rule_number r; for (r = 0; r < nrules; ++r) { int length = rule_rhs_length (&rules[r]); if (length > max) max = length; } return max; }
static void reduce_grammar_tables (void) { /* Report and flag useless productions. */ { rule_number r; for (r = 0; r < nrules; r++) rules[r].useful = bitset_test (P, r); grammar_rules_useless_report (_("rule useless in grammar")); } /* Map the nonterminals to their new index: useful first, useless afterwards. Kept for later report. */ { int useful = 0; int useless = nrules - nuseless_productions; rule *rules_sorted = xnmalloc (nrules, sizeof *rules_sorted); rule_number r; for (r = 0; r < nrules; ++r) rules_sorted[rules[r].useful ? useful++ : useless++] = rules[r]; free (rules); rules = rules_sorted; /* Renumber the rules markers in RITEMS. */ for (r = 0; r < nrules; ++r) { item_number *rhsp = rules[r].rhs; for (/* Nothing. */; *rhsp >= 0; ++rhsp) /* Nothing. */; *rhsp = rule_number_as_item_number (r); rules[r].number = r; } nrules -= nuseless_productions; } /* Adjust NRITEMS. */ { rule_number r; int length; for (r = nrules; r < nrules + nuseless_productions; ++r) { length = rule_rhs_length (&rules[r]); nritems -= length + 1; } } }
static void prepare_rules (void) { unsigned int *rline = xnmalloc (nrules, sizeof *rline); symbol_number *r1 = xnmalloc (nrules, sizeof *r1); unsigned int *r2 = xnmalloc (nrules, sizeof *r2); int *dprec = xnmalloc (nrules, sizeof *dprec); int *merger = xnmalloc (nrules, sizeof *merger); int *immediate = xnmalloc (nrules, sizeof *immediate); rule_number r; for (r = 0; r < nrules; ++r) { /* LHS of the rule R. */ r1[r] = rules[r].lhs->number; /* Length of rule R's RHS. */ r2[r] = rule_rhs_length (&rules[r]); /* Line where rule was defined. */ rline[r] = rules[r].location.start.line; /* Dynamic precedence (GLR). */ dprec[r] = rules[r].dprec; /* Merger-function index (GLR). */ merger[r] = rules[r].merger; /* Immediate reduction flags (GLR). */ immediate[r] = rules[r].is_predicate; } muscle_insert_unsigned_int_table ("rline", rline, 0, 0, nrules); muscle_insert_symbol_number_table ("r1", r1, 0, 0, nrules); muscle_insert_unsigned_int_table ("r2", r2, 0, 0, nrules); muscle_insert_int_table ("dprec", dprec, 0, 0, nrules); muscle_insert_int_table ("merger", merger, 0, 0, nrules); muscle_insert_int_table ("immediate", immediate, 0, 0, nrules); MUSCLE_INSERT_INT ("rules_number", nrules); MUSCLE_INSERT_INT ("max_left_semantic_context", max_left_semantic_context); free (rline); free (r1); free (r2); free (dprec); free (merger); free (immediate); }