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