X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/20c1e2ad9841d06212465ce0b81c771d08c9ec51..2f82502a6fc07c455cbbfa94e75c5febf930d1c9:/src/tables.c diff --git a/src/tables.c b/src/tables.c index 0b4fd275..e1f0c61e 100644 --- a/src/tables.c +++ b/src/tables.c @@ -82,7 +82,7 @@ static base_t *width = NULL; /* For a given state, N = ACTROW[SYMBOL]: If N = 0, stands for `run the default action'. - If N = MIN, stands for `raise a parse error'. + If N = MIN, stands for `raise a syntax error'. If N > 0, stands for `shift SYMBOL and go to n'. If N < 0, stands for `reduce -N'. */ typedef short action_t; @@ -116,7 +116,7 @@ static int conflict_list_free; static size_t table_size = 32768; base_t *table = NULL; base_t *check = NULL; -/* The value used in TABLE to denote explicit parse errors +/* The value used in TABLE to denote explicit syntax errors (%nonassoc), a negative infinite. First defaults to ACTION_MIN, but in order to keep small tables, renumbered as TABLE_ERROR, which is the smallest (non error) value minus 1. */ @@ -418,7 +418,7 @@ token_actions (void) /* Find the rules which are reduced. */ if (!glr_parser) for (r = 0; r < nrules; ++r) - rules[r].useful = FALSE; + rules[r].useful = false; for (i = 0; i < nstates; ++i) { @@ -433,9 +433,9 @@ token_actions (void) { for (j = 0; j < ntokens; ++j) if (actrow[j] < 0 && actrow[j] != ACTION_MIN) - rules[item_number_as_rule_number (actrow[j])].useful = TRUE; + rules[item_number_as_rule_number (actrow[j])].useful = true; if (yydefact[i]) - rules[yydefact[i] - 1].useful = TRUE; + rules[yydefact[i] - 1].useful = true; } } @@ -610,6 +610,15 @@ matching_state (vector_number_t vector) t = tally[i]; w = width[i]; + /* If VECTOR has GLR conflicts, return -1 */ + if (conflict_tos[i] != NULL) + { + int j; + for (j = 0; j < t; j += 1) + if (conflict_tos[i][j] != 0) + return -1; + } + for (prev = vector - 1; prev >= 0; prev--) { vector_number_t j = order[prev]; @@ -622,7 +631,8 @@ matching_state (vector_number_t vector) return -1; for (k = 0; match && k < t; k++) - if (tos[j][k] != tos[i][k] || froms[j][k] != froms[i][k]) + if (tos[j][k] != tos[i][k] || froms[j][k] != froms[i][k] + || (conflict_tos[j] != NULL && conflict_tos[j][k] != 0)) match = 0; if (match) @@ -682,8 +692,7 @@ pack_vector (vector_number_t vector) if (loc > high) high = loc; - if (j < BASE_MIN || BASE_MAX < j) - fatal ("base_t too small to hold %d\n", j); + assert (BASE_MIN <= j && j <= BASE_MAX); return j; } } @@ -792,9 +801,9 @@ tables_generate (void) token_actions (); goto_actions (); - XFREE (goto_map + ntokens); - XFREE (from_state); - XFREE (to_state); + free (goto_map + ntokens); + free (from_state); + free (to_state); order = XCALLOC (vector_number_t, nvectors); sort_actions (); @@ -806,8 +815,8 @@ tables_generate (void) for (i = 0; i < nvectors; i++) { - XFREE (froms[i]); - XFREE (tos[i]); + free (froms[i]); + free (tos[i]); XFREE (conflict_tos[i]); }