]> git.saurik.com Git - bison.git/blame - src/tables.c
introduced a GCC-like -Werror=type
[bison.git] / src / tables.c
CommitLineData
443594d0 1/* Output the generated parsing program for Bison.
ff5c8b85 2
34136e65 3 Copyright (C) 1984, 1986, 1989, 1992, 2000-2006, 2009-2012 Free
575619af 4 Software Foundation, Inc.
c6f1a33c
AD
5
6 This file is part of Bison, the GNU Compiler Compiler.
7
f16b0819
PE
8 This program is free software: you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation, either version 3 of the License, or
11 (at your option) any later version.
c6f1a33c 12
f16b0819
PE
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
c6f1a33c
AD
17
18 You should have received a copy of the GNU General Public License
f16b0819 19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c6f1a33c 20
2cec9080 21#include <config.h>
c6f1a33c 22#include "system.h"
c801dbf7
PE
23
24#include <bitsetv.h>
c801dbf7
PE
25
26#include "complain.h"
27#include "conflicts.h"
c6f1a33c 28#include "files.h"
c801dbf7 29#include "getargs.h"
c6f1a33c 30#include "gram.h"
c6f1a33c 31#include "lalr.h"
7254f6a8 32#include "muscle-tab.h"
c6f1a33c
AD
33#include "reader.h"
34#include "symtab.h"
c6f1a33c
AD
35#include "tables.h"
36
443594d0
PE
37/* Several tables are indexed both by state and nonterminal numbers.
38 We call such an index a `vector'; i.e., a vector is either a state
39 or a nonterminal number.
c6f1a33c
AD
40
41 Of course vector_number_t ought to be wide enough to contain
c801dbf7 42 state_number and symbol_number. */
f6fbd3da 43typedef int vector_number;
ff5c8b85 44
7cf96b1a 45#if 0 /* Not currently used. */
ff5c8b85
PE
46static inline vector_number
47state_number_to_vector_number (state_number s)
48{
49 return s;
50}
7cf96b1a 51#endif
ff5c8b85
PE
52
53static inline vector_number
a737b216 54symbol_number_to_vector_number (symbol_number sym)
ff5c8b85 55{
a737b216 56 return state_number_as_int (nstates) + sym - ntokens;
ff5c8b85 57}
c6f1a33c
AD
58
59int nvectors;
60
61
c801dbf7 62/* FROMS and TOS are indexed by vector_number.
c6f1a33c
AD
63
64 If VECTOR is a nonterminal, (FROMS[VECTOR], TOS[VECTOR]) form an
65 array of state numbers of the non defaulted GOTO on VECTOR.
66
67 If VECTOR is a state, TOS[VECTOR] is the array of actions to do on
68 the (array of) symbols FROMS[VECTOR].
69
70 In both cases, TALLY[VECTOR] is the size of the arrays
71 FROMS[VECTOR], TOS[VECTOR]; and WIDTH[VECTOR] =
72 (FROMS[VECTOR][SIZE] - FROMS[VECTOR][0] + 1) where SIZE =
73 TALLY[VECTOR].
74
c801dbf7
PE
75 FROMS therefore contains symbol_number and action_number,
76 TOS state_number and action_number,
c6f1a33c
AD
77 TALLY sizes,
78 WIDTH differences of FROMS.
79
c801dbf7
PE
80 Let base_number be the type of FROMS, TOS, and WIDTH. */
81#define BASE_MAXIMUM INT_MAX
82#define BASE_MINIMUM INT_MIN
c6f1a33c 83
da2a7671
PE
84static base_number **froms;
85static base_number **tos;
86static unsigned int **conflict_tos;
f6fbd3da 87static int *tally;
da2a7671 88static base_number *width;
c6f1a33c
AD
89
90
91/* For a given state, N = ACTROW[SYMBOL]:
92
93 If N = 0, stands for `run the default action'.
6e649e65 94 If N = MIN, stands for `raise a syntax error'.
c6f1a33c
AD
95 If N > 0, stands for `shift SYMBOL and go to n'.
96 If N < 0, stands for `reduce -N'. */
f6fbd3da
PE
97typedef int action_number;
98#define ACTION_NUMBER_MINIMUM INT_MIN
c6f1a33c 99
da2a7671 100static action_number *actrow;
c6f1a33c
AD
101
102/* FROMS and TOS are reordered to be compressed. ORDER[VECTOR] is the
103 new vector number of VECTOR. We skip `empty' vectors (i.e.,
104 TALLY[VECTOR] = 0), and call these `entries'. */
da2a7671 105static vector_number *order;
c6f1a33c
AD
106static int nentries;
107
c801dbf7 108base_number *base = NULL;
c6f1a33c 109/* A distinguished value of BASE, negative infinite. During the
c801dbf7 110 computation equals to BASE_MINIMUM, later mapped to BASE_NINF to
c6f1a33c 111 keep parser tables small. */
c801dbf7
PE
112base_number base_ninf = 0;
113static base_number *pos = NULL;
c6f1a33c 114
da2a7671
PE
115static unsigned int *conflrow;
116unsigned int *conflict_table;
117unsigned int *conflict_list;
c6f1a33c
AD
118int conflict_list_cnt;
119static int conflict_list_free;
120
121/* TABLE_SIZE is the allocated size of both TABLE and CHECK. We start
122 with more or less the original hard-coded value (which was
123 SHRT_MAX). */
ff5c8b85 124static int table_size = 32768;
da2a7671
PE
125base_number *table;
126base_number *check;
6e649e65 127/* The value used in TABLE to denote explicit syntax errors
aa0cb40d 128 (%nonassoc), a negative infinite. First defaults to ACTION_NUMBER_MINIMUM,
c6f1a33c
AD
129 but in order to keep small tables, renumbered as TABLE_ERROR, which
130 is the smallest (non error) value minus 1. */
c801dbf7 131base_number table_ninf = 0;
c6f1a33c
AD
132static int lowzero;
133int high;
134
c801dbf7
PE
135state_number *yydefgoto;
136rule_number *yydefact;
c6f1a33c
AD
137
138/*----------------------------------------------------------------.
139| If TABLE (and CHECK) appear to be small to be addressed at |
140| DESIRED, grow them. Note that TABLE[DESIRED] is to be used, so |
141| the desired size is at least DESIRED + 1. |
142`----------------------------------------------------------------*/
143
144static void
ff5c8b85 145table_grow (int desired)
c6f1a33c 146{
ff5c8b85 147 int old_size = table_size;
c6f1a33c
AD
148
149 while (table_size <= desired)
150 table_size *= 2;
151
152 if (trace_flag & trace_resource)
427c0dda 153 fprintf (stderr, "growing table and check from: %d to %d\n",
e9690142 154 old_size, table_size);
c6f1a33c 155
da2a7671
PE
156 table = xnrealloc (table, table_size, sizeof *table);
157 conflict_table = xnrealloc (conflict_table, table_size,
e9690142 158 sizeof *conflict_table);
da2a7671 159 check = xnrealloc (check, table_size, sizeof *check);
c6f1a33c
AD
160
161 for (/* Nothing. */; old_size < table_size; ++old_size)
162 {
163 table[old_size] = 0;
da2a7671 164 conflict_table[old_size] = 0;
c6f1a33c
AD
165 check[old_size] = -1;
166 }
167}
168
169
170
171
172/*-------------------------------------------------------------------.
c801dbf7 173| For GLR parsers, for each conflicted token in S, as indicated |
e9690142
JD
174| by non-zero entries in CONFLROW, create a list of possible |
175| reductions that are alternatives to the shift or reduction |
c801dbf7 176| currently recorded for that token in S. Store the alternative |
e9690142 177| reductions followed by a 0 in CONFLICT_LIST, updating |
c6f1a33c 178| CONFLICT_LIST_CNT, and storing an index to the start of the list |
e9690142 179| back into CONFLROW. |
c6f1a33c
AD
180`-------------------------------------------------------------------*/
181
182static void
c801dbf7 183conflict_row (state *s)
c6f1a33c
AD
184{
185 int i, j;
c801dbf7 186 reductions *reds = s->reductions;
c6f1a33c 187
916708d5 188 if (!nondeterministic_parser)
c6f1a33c
AD
189 return;
190
191 for (j = 0; j < ntokens; j += 1)
192 if (conflrow[j])
193 {
e9690142
JD
194 conflrow[j] = conflict_list_cnt;
195
196 /* Find all reductions for token J, and record all that do not
197 match ACTROW[J]. */
198 for (i = 0; i < reds->num; i += 1)
199 if (bitset_test (reds->lookahead_tokens[i], j)
200 && (actrow[j]
201 != rule_number_as_item_number (reds->rules[i]->number)))
202 {
203 aver (0 < conflict_list_free);
204 conflict_list[conflict_list_cnt] = reds->rules[i]->number + 1;
205 conflict_list_cnt += 1;
206 conflict_list_free -= 1;
207 }
208
209 /* Leave a 0 at the end. */
210 aver (0 < conflict_list_free);
211 conflict_list[conflict_list_cnt] = 0;
212 conflict_list_cnt += 1;
213 conflict_list_free -= 1;
c6f1a33c
AD
214 }
215}
216
217
218/*------------------------------------------------------------------.
8dd162d3 219| Decide what to do for each type of token if seen as the |
742e4900 220| lookahead in specified state. The value returned is used as the |
c6f1a33c
AD
221| default action (yydefact) for the state. In addition, ACTROW is |
222| filled with what to do for each kind of token, index by symbol |
223| number, with zero meaning do the default action. The value |
e9690142
JD
224| ACTION_NUMBER_MINIMUM, a very negative number, means this |
225| situation is an error. The parser recognizes this value |
226| specially. |
c6f1a33c 227| |
742e4900 228| This is where conflicts are resolved. The loop over lookahead |
c6f1a33c
AD
229| rules considered lower-numbered rules last, and the last rule |
230| considered that likes a token gets to handle it. |
231| |
232| For GLR parsers, also sets CONFLROW[SYM] to an index into |
233| CONFLICT_LIST iff there is an unresolved conflict (s/r or r/r) |
234| with symbol SYM. The default reduction is not used for a symbol |
235| that has any such conflicts. |
236`------------------------------------------------------------------*/
237
c801dbf7
PE
238static rule *
239action_row (state *s)
c6f1a33c
AD
240{
241 int i;
110ef36a 242 rule *default_reduction = NULL;
c801dbf7
PE
243 reductions *reds = s->reductions;
244 transitions *trans = s->transitions;
245 errs *errp = s->errs;
c6f1a33c 246 /* Set to nonzero to inhibit having any default reduction. */
d0829076
PE
247 bool nodefault = false;
248 bool conflicted = false;
c6f1a33c
AD
249
250 for (i = 0; i < ntokens; i++)
251 actrow[i] = conflrow[i] = 0;
252
742e4900 253 if (reds->lookahead_tokens)
c6f1a33c
AD
254 {
255 int j;
256 bitset_iterator biter;
257 /* loop over all the rules available here which require
e9690142
JD
258 lookahead (in reverse order to give precedence to the first
259 rule) */
c801dbf7 260 for (i = reds->num - 1; i >= 0; --i)
e9690142
JD
261 /* and find each token which the rule finds acceptable
262 to come next */
263 BITSET_FOR_EACH (biter, reds->lookahead_tokens[i], j, 0)
264 {
265 /* and record this rule as the rule to use if that
266 token follows. */
267 if (actrow[j] != 0)
268 {
269 conflicted = true;
270 conflrow[j] = 1;
271 }
272 actrow[j] = rule_number_as_item_number (reds->rules[i]->number);
273 }
c6f1a33c
AD
274 }
275
276 /* Now see which tokens are allowed for shifts in this state. For
277 them, record the shift as the thing to do. So shift is preferred
278 to reduce. */
c801dbf7 279 FOR_EACH_SHIFT (trans, i)
c6f1a33c 280 {
c801dbf7
PE
281 symbol_number sym = TRANSITION_SYMBOL (trans, i);
282 state *shift_state = trans->states[i];
c6f1a33c 283
c801dbf7 284 if (actrow[sym] != 0)
e9690142
JD
285 {
286 conflicted = true;
287 conflrow[sym] = 1;
288 }
c801dbf7 289 actrow[sym] = state_number_as_int (shift_state->number);
c6f1a33c
AD
290
291 /* Do not use any default reduction if there is a shift for
e9690142 292 error */
c801dbf7 293 if (sym == errtoken->number)
e9690142 294 nodefault = true;
c6f1a33c
AD
295 }
296
297 /* See which tokens are an explicit error in this state (due to
c801dbf7
PE
298 %nonassoc). For them, record ACTION_NUMBER_MINIMUM as the
299 action. */
c6f1a33c
AD
300 for (i = 0; i < errp->num; i++)
301 {
c801dbf7
PE
302 symbol *sym = errp->symbols[i];
303 actrow[sym->number] = ACTION_NUMBER_MINIMUM;
c6f1a33c
AD
304 }
305
110ef36a 306 /* Turn off default reductions where requested by the user. See
7254f6a8
JD
307 state_lookahead_tokens_count in lalr.c to understand when states are
308 labeled as consistent. */
309 {
110ef36a 310 char *default_reductions =
5bab9d08 311 muscle_percent_define_get ("lr.default-reductions");
f518dbaf 312 if (STRNEQ (default_reductions, "most") && !s->consistent)
7254f6a8 313 nodefault = true;
110ef36a 314 free (default_reductions);
7254f6a8
JD
315 }
316
c6f1a33c
AD
317 /* Now find the most common reduction and make it the default action
318 for this state. */
319
c801dbf7 320 if (reds->num >= 1 && !nodefault)
c6f1a33c 321 {
c801dbf7 322 if (s->consistent)
e9690142 323 default_reduction = reds->rules[0];
c6f1a33c 324 else
e9690142
JD
325 {
326 int max = 0;
327 for (i = 0; i < reds->num; i++)
328 {
329 int count = 0;
330 rule *r = reds->rules[i];
331 symbol_number j;
332
333 for (j = 0; j < ntokens; j++)
334 if (actrow[j] == rule_number_as_item_number (r->number))
335 count++;
336
337 if (count > max)
338 {
339 max = count;
340 default_reduction = r;
341 }
342 }
343
344 /* GLR parsers need space for conflict lists, so we can't
345 default conflicted entries. For non-conflicted entries
346 or as long as we are not building a GLR parser,
347 actions that match the default are replaced with zero,
348 which means "use the default". */
349
350 if (max > 0)
351 {
352 int j;
353 for (j = 0; j < ntokens; j++)
354 if (actrow[j]
110ef36a 355 == rule_number_as_item_number (default_reduction->number)
e9690142
JD
356 && ! (nondeterministic_parser && conflrow[j]))
357 actrow[j] = 0;
358 }
359 }
c6f1a33c
AD
360 }
361
110ef36a 362 /* If have no default reduction, the default is an error.
c6f1a33c
AD
363 So replace any action which says "error" with "use default". */
364
110ef36a 365 if (!default_reduction)
c6f1a33c 366 for (i = 0; i < ntokens; i++)
c801dbf7 367 if (actrow[i] == ACTION_NUMBER_MINIMUM)
e9690142 368 actrow[i] = 0;
c6f1a33c
AD
369
370 if (conflicted)
c801dbf7 371 conflict_row (s);
c6f1a33c 372
110ef36a 373 return default_reduction;
c6f1a33c
AD
374}
375
376
c801dbf7
PE
377/*----------------------------------------.
378| Set FROMS, TOS, TALLY and WIDTH for S. |
379`----------------------------------------*/
c6f1a33c
AD
380
381static void
c801dbf7 382save_row (state_number s)
c6f1a33c 383{
c801dbf7 384 symbol_number i;
c6f1a33c 385 int count;
ff5c8b85
PE
386 base_number *sp;
387 base_number *sp1;
388 base_number *sp2;
da2a7671 389 unsigned int *sp3;
c6f1a33c 390
c801dbf7 391 /* Number of non default actions in S. */
c6f1a33c
AD
392 count = 0;
393 for (i = 0; i < ntokens; i++)
394 if (actrow[i] != 0)
395 count++;
396
397 if (count == 0)
398 return;
399
400 /* Allocate non defaulted actions. */
da2a7671
PE
401 froms[s] = sp = sp1 = xnmalloc (count, sizeof *sp1);
402 tos[s] = sp2 = xnmalloc (count, sizeof *sp2);
403 conflict_tos[s] = sp3 =
404 nondeterministic_parser ? xnmalloc (count, sizeof *sp3) : NULL;
c6f1a33c
AD
405
406 /* Store non defaulted actions. */
407 for (i = 0; i < ntokens; i++)
408 if (actrow[i] != 0)
409 {
e9690142
JD
410 *sp1++ = i;
411 *sp2++ = actrow[i];
412 if (nondeterministic_parser)
413 *sp3++ = conflrow[i];
c6f1a33c
AD
414 }
415
c801dbf7
PE
416 tally[s] = count;
417 width[s] = sp1[-1] - sp[0] + 1;
c6f1a33c
AD
418}
419
420
421/*------------------------------------------------------------------.
422| Figure out the actions for the specified state, indexed by |
742e4900 423| lookahead token type. |
c6f1a33c
AD
424| |
425| The YYDEFACT table is output now. The detailed info is saved for |
426| putting into YYTABLE later. |
427`------------------------------------------------------------------*/
428
429static void
430token_actions (void)
431{
c801dbf7
PE
432 state_number i;
433 symbol_number j;
434 rule_number r;
c8f002c7 435
916708d5 436 int nconflict = nondeterministic_parser ? conflicts_total_count () : 0;
c6f1a33c 437
da2a7671 438 yydefact = xnmalloc (nstates, sizeof *yydefact);
c6f1a33c 439
da2a7671
PE
440 actrow = xnmalloc (ntokens, sizeof *actrow);
441 conflrow = xnmalloc (ntokens, sizeof *conflrow);
c6f1a33c 442
da2a7671 443 conflict_list = xnmalloc (1 + 2 * nconflict, sizeof *conflict_list);
ea99527d
AD
444 conflict_list_free = 2 * nconflict;
445 conflict_list_cnt = 1;
446
c8f002c7 447 /* Find the rules which are reduced. */
916708d5 448 if (!nondeterministic_parser)
c6f1a33c 449 for (r = 0; r < nrules; ++r)
8307162d 450 rules[r].useful = false;
c6f1a33c 451
c6f1a33c
AD
452 for (i = 0; i < nstates; ++i)
453 {
110ef36a
JD
454 rule *default_reduction = action_row (states[i]);
455 yydefact[i] = default_reduction ? default_reduction->number + 1 : 0;
c6f1a33c 456 save_row (i);
c6f1a33c 457
c8f002c7 458 /* Now that the parser was computed, we can find which rules are
e9690142
JD
459 really reduced, and which are not because of SR or RR
460 conflicts. */
916708d5 461 if (!nondeterministic_parser)
e9690142
JD
462 {
463 for (j = 0; j < ntokens; ++j)
464 if (actrow[j] < 0 && actrow[j] != ACTION_NUMBER_MINIMUM)
465 rules[item_number_as_rule_number (actrow[j])].useful = true;
466 if (yydefact[i])
467 rules[yydefact[i] - 1].useful = true;
468 }
c8f002c7 469 }
c6f1a33c
AD
470
471 free (actrow);
472 free (conflrow);
473}
474
475
476/*------------------------------------------------------------------.
477| Compute FROMS[VECTOR], TOS[VECTOR], TALLY[VECTOR], WIDTH[VECTOR], |
478| i.e., the information related to non defaulted GOTO on the nterm |
c801dbf7 479| SYM. |
c6f1a33c 480| |
c801dbf7
PE
481| DEFAULT_STATE is the principal destination on SYM, i.e., the |
482| default GOTO destination on SYM. |
c6f1a33c
AD
483`------------------------------------------------------------------*/
484
485static void
c801dbf7 486save_column (symbol_number sym, state_number default_state)
c6f1a33c 487{
78143b92 488 goto_number i;
c801dbf7
PE
489 base_number *sp;
490 base_number *sp1;
491 base_number *sp2;
c6f1a33c 492 int count;
c801dbf7 493 vector_number symno = symbol_number_to_vector_number (sym);
c6f1a33c 494
ff5c8b85
PE
495 goto_number begin = goto_map[sym - ntokens];
496 goto_number end = goto_map[sym - ntokens + 1];
c6f1a33c
AD
497
498 /* Number of non default GOTO. */
499 count = 0;
500 for (i = begin; i < end; i++)
501 if (to_state[i] != default_state)
502 count++;
503
504 if (count == 0)
505 return;
506
507 /* Allocate room for non defaulted gotos. */
da2a7671
PE
508 froms[symno] = sp = sp1 = xnmalloc (count, sizeof *sp1);
509 tos[symno] = sp2 = xnmalloc (count, sizeof *sp2);
c6f1a33c
AD
510
511 /* Store the state numbers of the non defaulted gotos. */
512 for (i = begin; i < end; i++)
513 if (to_state[i] != default_state)
514 {
e9690142
JD
515 *sp1++ = from_state[i];
516 *sp2++ = to_state[i];
c6f1a33c
AD
517 }
518
519 tally[symno] = count;
520 width[symno] = sp1[-1] - sp[0] + 1;
521}
522
523
c801dbf7
PE
524/*-------------------------------------------------------------.
525| Return `the' most common destination GOTO on SYM (a nterm). |
526`-------------------------------------------------------------*/
c6f1a33c 527
c801dbf7 528static state_number
f6fbd3da 529default_goto (symbol_number sym, size_t state_count[])
c6f1a33c 530{
c801dbf7 531 state_number s;
78143b92 532 goto_number i;
ff5c8b85
PE
533 goto_number m = goto_map[sym - ntokens];
534 goto_number n = goto_map[sym - ntokens + 1];
535 state_number default_state = -1;
f6fbd3da 536 size_t max = 0;
c6f1a33c
AD
537
538 if (m == n)
ff5c8b85 539 return -1;
c6f1a33c
AD
540
541 for (s = 0; s < nstates; s++)
542 state_count[s] = 0;
543
544 for (i = m; i < n; i++)
545 state_count[to_state[i]]++;
546
547 for (s = 0; s < nstates; s++)
548 if (state_count[s] > max)
549 {
e9690142
JD
550 max = state_count[s];
551 default_state = s;
c6f1a33c
AD
552 }
553
554 return default_state;
555}
556
557
558/*-------------------------------------------------------------------.
559| Figure out what to do after reducing with each rule, depending on |
560| the saved state from before the beginning of parsing the data that |
561| matched this rule. |
562| |
563| The YYDEFGOTO table is output now. The detailed info is saved for |
564| putting into YYTABLE later. |
565`-------------------------------------------------------------------*/
566
567static void
568goto_actions (void)
569{
c801dbf7 570 symbol_number i;
f6fbd3da 571 size_t *state_count = xnmalloc (nstates, sizeof *state_count);
da2a7671 572 yydefgoto = xnmalloc (nvars, sizeof *yydefgoto);
c6f1a33c
AD
573
574 /* For a given nterm I, STATE_COUNT[S] is the number of times there
575 is a GOTO to S on I. */
576 for (i = ntokens; i < nsyms; ++i)
577 {
c801dbf7 578 state_number default_state = default_goto (i, state_count);
c6f1a33c
AD
579 save_column (i, default_state);
580 yydefgoto[i - ntokens] = default_state;
581 }
582 free (state_count);
583}
584
585
586/*------------------------------------------------------------------.
587| Compute ORDER, a reordering of vectors, in order to decide how to |
588| pack the actions and gotos information into yytable. |
589`------------------------------------------------------------------*/
590
591static void
592sort_actions (void)
593{
594 int i;
595
596 nentries = 0;
597
598 for (i = 0; i < nvectors; i++)
599 if (tally[i] > 0)
600 {
e9690142
JD
601 int k;
602 int t = tally[i];
603 int w = width[i];
604 int j = nentries - 1;
c6f1a33c 605
e9690142
JD
606 while (j >= 0 && (width[order[j]] < w))
607 j--;
c6f1a33c 608
e9690142
JD
609 while (j >= 0 && (width[order[j]] == w) && (tally[order[j]] < t))
610 j--;
c6f1a33c 611
e9690142
JD
612 for (k = nentries - 1; k > j; k--)
613 order[k + 1] = order[k];
c6f1a33c 614
e9690142
JD
615 order[j + 1] = i;
616 nentries++;
c6f1a33c
AD
617 }
618}
619
620
621/* If VECTOR is a state which actions (reflected by FROMS, TOS, TALLY
622 and WIDTH of VECTOR) are common to a previous state, return this
623 state number.
624
625 In any other case, return -1. */
626
c801dbf7
PE
627static state_number
628matching_state (vector_number vector)
c6f1a33c 629{
c801dbf7 630 vector_number i = order[vector];
c6f1a33c
AD
631 int t;
632 int w;
633 int prev;
634
635 /* If VECTOR is a nterm, return -1. */
ff5c8b85 636 if (nstates <= i)
c6f1a33c
AD
637 return -1;
638
639 t = tally[i];
640 w = width[i];
641
51b4a04c
PH
642 /* If VECTOR has GLR conflicts, return -1 */
643 if (conflict_tos[i] != NULL)
644 {
645 int j;
646 for (j = 0; j < t; j += 1)
e9690142
JD
647 if (conflict_tos[i][j] != 0)
648 return -1;
51b4a04c
PH
649 }
650
c6f1a33c
AD
651 for (prev = vector - 1; prev >= 0; prev--)
652 {
c801dbf7 653 vector_number j = order[prev];
c6f1a33c
AD
654 int k;
655 int match = 1;
656
657 /* Given how ORDER was computed, if the WIDTH or TALLY is
e9690142 658 different, there cannot be a matching state. */
c6f1a33c 659 if (width[j] != w || tally[j] != t)
e9690142 660 return -1;
c6f1a33c
AD
661
662 for (k = 0; match && k < t; k++)
e9690142
JD
663 if (tos[j][k] != tos[i][k] || froms[j][k] != froms[i][k]
664 || (conflict_tos[j] != NULL && conflict_tos[j][k] != 0))
665 match = 0;
c6f1a33c
AD
666
667 if (match)
e9690142 668 return j;
c6f1a33c
AD
669 }
670
671 return -1;
672}
673
674
c801dbf7
PE
675static base_number
676pack_vector (vector_number vector)
c6f1a33c 677{
c801dbf7 678 vector_number i = order[vector];
c6f1a33c
AD
679 int j;
680 int t = tally[i];
681 int loc = 0;
c801dbf7
PE
682 base_number *from = froms[i];
683 base_number *to = tos[i];
c6f1a33c
AD
684 unsigned int *conflict_to = conflict_tos[i];
685
4f82b42a 686 aver (t != 0);
c6f1a33c 687
443594d0 688 for (j = lowzero - from[0]; ; j++)
c6f1a33c
AD
689 {
690 int k;
d0829076 691 bool ok = true;
c6f1a33c 692
4f82b42a 693 aver (j < table_size);
443594d0 694
c6f1a33c 695 for (k = 0; ok && k < t; k++)
e9690142
JD
696 {
697 loc = j + state_number_as_int (from[k]);
698 if (table_size <= loc)
699 table_grow (loc);
c6f1a33c 700
e9690142
JD
701 if (table[loc] != 0)
702 ok = false;
703 }
c6f1a33c
AD
704
705 for (k = 0; ok && k < vector; k++)
e9690142
JD
706 if (pos[k] == j)
707 ok = false;
c6f1a33c
AD
708
709 if (ok)
e9690142
JD
710 {
711 for (k = 0; k < t; k++)
712 {
713 loc = j + from[k];
714 table[loc] = to[k];
715 if (nondeterministic_parser && conflict_to != NULL)
716 conflict_table[loc] = conflict_to[k];
717 check[loc] = from[k];
718 }
719
720 while (table[lowzero] != 0)
721 lowzero++;
722
723 if (loc > high)
724 high = loc;
725
726 aver (BASE_MINIMUM <= j && j <= BASE_MAXIMUM);
727 return j;
728 }
c6f1a33c 729 }
c6f1a33c
AD
730}
731
732
733/*-------------------------------------------------------------.
734| Remap the negative infinite in TAB from NINF to the greatest |
735| possible smallest value. Return it. |
736| |
737| In most case this allows us to use shorts instead of ints in |
738| parsers. |
739`-------------------------------------------------------------*/
740
c801dbf7 741static base_number
ff5c8b85 742table_ninf_remap (base_number tab[], int size, base_number ninf)
c6f1a33c 743{
c801dbf7 744 base_number res = 0;
ff5c8b85 745 int i;
c6f1a33c
AD
746
747 for (i = 0; i < size; i++)
748 if (tab[i] < res && tab[i] != ninf)
05846dae 749 res = tab[i];
c6f1a33c
AD
750
751 --res;
752
753 for (i = 0; i < size; i++)
754 if (tab[i] == ninf)
755 tab[i] = res;
756
757 return res;
758}
759
760static void
761pack_table (void)
762{
763 int i;
764
da2a7671
PE
765 base = xnmalloc (nvectors, sizeof *base);
766 pos = xnmalloc (nentries, sizeof *pos);
767 table = xcalloc (table_size, sizeof *table);
768 conflict_table = xcalloc (table_size, sizeof *conflict_table);
769 check = xnmalloc (table_size, sizeof *check);
c6f1a33c
AD
770
771 lowzero = 0;
772 high = 0;
773
774 for (i = 0; i < nvectors; i++)
c801dbf7 775 base[i] = BASE_MINIMUM;
c6f1a33c 776
ff5c8b85 777 for (i = 0; i < table_size; i++)
c6f1a33c
AD
778 check[i] = -1;
779
780 for (i = 0; i < nentries; i++)
781 {
c801dbf7
PE
782 state_number s = matching_state (i);
783 base_number place;
c6f1a33c 784
c801dbf7 785 if (s < 0)
e9690142
JD
786 /* A new set of state actions, or a nonterminal. */
787 place = pack_vector (i);
c6f1a33c 788 else
e9690142
JD
789 /* Action of I were already coded for S. */
790 place = base[s];
c6f1a33c
AD
791
792 pos[i] = place;
793 base[order[i]] = place;
794 }
795
796 /* Use the greatest possible negative infinites. */
c801dbf7
PE
797 base_ninf = table_ninf_remap (base, nvectors, BASE_MINIMUM);
798 table_ninf = table_ninf_remap (table, high + 1, ACTION_NUMBER_MINIMUM);
c6f1a33c 799
c6f1a33c
AD
800 free (pos);
801}
802
803\f
804
805/*-----------------------------------------------------------------.
806| Compute and output yydefact, yydefgoto, yypact, yypgoto, yytable |
807| and yycheck. |
808`-----------------------------------------------------------------*/
809
810void
811tables_generate (void)
812{
3325ddc4
AD
813 int i;
814
443594d0
PE
815 /* This is a poor way to make sure the sizes are properly
816 correlated. In particular the signedness is not taken into
817 account. But it's not useless. */
8a6f72f3 818 verify (sizeof nstates <= sizeof nvectors
e9690142 819 && sizeof nvars <= sizeof nvectors);
c6f1a33c
AD
820
821 nvectors = state_number_as_int (nstates) + nvars;
822
da2a7671
PE
823 froms = xcalloc (nvectors, sizeof *froms);
824 tos = xcalloc (nvectors, sizeof *tos);
825 conflict_tos = xcalloc (nvectors, sizeof *conflict_tos);
826 tally = xcalloc (nvectors, sizeof *tally);
827 width = xnmalloc (nvectors, sizeof *width);
c6f1a33c
AD
828
829 token_actions ();
c6f1a33c
AD
830
831 goto_actions ();
ff5c8b85 832 free (goto_map);
b1ae9233
AD
833 free (from_state);
834 free (to_state);
c6f1a33c 835
da2a7671 836 order = xcalloc (nvectors, sizeof *order);
c6f1a33c
AD
837 sort_actions ();
838 pack_table ();
839 free (order);
840
841 free (tally);
842 free (width);
3325ddc4
AD
843
844 for (i = 0; i < nvectors; i++)
845 {
b1ae9233
AD
846 free (froms[i]);
847 free (tos[i]);
afbb696d 848 free (conflict_tos[i]);
3325ddc4
AD
849 }
850
851 free (froms);
852 free (tos);
853 free (conflict_tos);
c6f1a33c
AD
854}
855
856
857/*-------------------------.
858| Free the parser tables. |
859`-------------------------*/
860
861void
862tables_free (void)
863{
864 free (base);
865 free (conflict_table);
866 free (conflict_list);
867 free (table);
868 free (check);
869 free (yydefgoto);
870 free (yydefact);
871}