]> git.saurik.com Git - bison.git/blame - src/lalr.c
(set_goto_map): Don't allow ngotos to equal
[bison.git] / src / lalr.c
CommitLineData
5362cd5f
PE
1/* Compute look-ahead criteria for Bison.
2
8dd162d3 3 Copyright (C) 1984, 1986, 1989, 2000, 2001, 2002, 2003, 2004
b0299a2e 4 Free Software Foundation, Inc.
d0fb370f 5
340ef489 6 This file is part of Bison, the GNU Compiler Compiler.
d0fb370f 7
340ef489
AD
8 Bison 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 2, or (at your option)
11 any later version.
d0fb370f 12
340ef489
AD
13 Bison 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.
d0fb370f 17
340ef489
AD
18 You should have received a copy of the GNU General Public License
19 along with Bison; see the file COPYING. If not, write to
20 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
21 Boston, MA 02111-1307, USA. */
d0fb370f
RS
22
23
720d742f 24/* Compute how to make the finite state machine deterministic; find
8dd162d3 25 which rules need look-ahead in each state, and which look-ahead
340ef489 26 tokens they accept. */
d0fb370f 27
d0fb370f 28#include "system.h"
5dde5425
PE
29
30#include <bitset.h>
31#include <bitsetv.h>
32#include <quotearg.h>
33
b2ca4022 34#include "LR0.h"
a0f6b076 35#include "complain.h"
340ef489 36#include "derives.h"
f67d13aa 37#include "getargs.h"
5dde5425
PE
38#include "gram.h"
39#include "lalr.h"
40#include "nullable.h"
41#include "reader.h"
42#include "relation.h"
43#include "symtab.h"
d0fb370f 44
4cf44c00
PE
45goto_number *goto_map;
46static goto_number ngotos;
47state_number *from_state;
48state_number *to_state;
e68e0410
AD
49
50/* Linked list of goto numbers. */
5dde5425 51typedef struct goto_list
e68e0410 52{
5dde5425
PE
53 struct goto_list *next;
54 goto_number value;
55} goto_list;
e68e0410
AD
56
57
3325ddc4
AD
58/* LA is a LR by NTOKENS matrix of bits. LA[l, i] is 1 if the rule
59 LArule[l] is applicable in the appropriate state when the next
60 token is symbol i. If LA[l, i] and LA[l, j] are both 1 for i != j,
61 it is a conflict. */
62
63static bitsetv LA = NULL;
d200e455 64size_t nLA;
9703cc49 65
d0fb370f 66
fe961097 67/* And for the famous F variable, which name is so descriptive that a
ddcd5fdf 68 comment is hardly needed. <grin>. */
914feea9 69static bitsetv F = NULL;
ddcd5fdf 70
5dde5425
PE
71static goto_number **includes;
72static goto_list **lookback;
aa2aab3c
AD
73
74
720d742f 75
bb527fc2 76
4a120d45 77static void
d2729d44 78set_goto_map (void)
d0fb370f 79{
5dde5425
PE
80 state_number s;
81 goto_number *temp_map;
d0fb370f 82
5362cd5f
PE
83 CALLOC (goto_map, nvars + 1);
84 CALLOC (temp_map, nvars + 1);
d0fb370f
RS
85
86 ngotos = 0;
5dde5425 87 for (s = 0; s < nstates; ++s)
7215de24 88 {
5dde5425 89 transitions *sp = states[s]->transitions;
d57650a5 90 int i;
ccaf65bc 91 for (i = sp->num - 1; i >= 0 && TRANSITION_IS_GOTO (sp, i); --i)
7215de24 92 {
7215de24 93 ngotos++;
60e3ecc7
PE
94
95 /* Abort if (ngotos + 1) would overflow. */
96 if (ngotos == GOTO_NUMBER_MAXIMUM)
4cf44c00 97 abort ();
60e3ecc7 98
5362cd5f 99 goto_map[TRANSITION_SYMBOL (sp, i) - ntokens]++;
7215de24
AD
100 }
101 }
d0fb370f 102
d0b0fefa 103 {
60e3ecc7 104 goto_number k = 0;
d57650a5 105 int i;
d0b0fefa
AD
106 for (i = ntokens; i < nsyms; i++)
107 {
5362cd5f
PE
108 temp_map[i - ntokens] = k;
109 k += goto_map[i - ntokens];
d0b0fefa 110 }
d0fb370f 111
d0b0fefa 112 for (i = ntokens; i < nsyms; i++)
5362cd5f 113 goto_map[i - ntokens] = temp_map[i - ntokens];
d0fb370f 114
5362cd5f
PE
115 goto_map[nsyms - ntokens] = ngotos;
116 temp_map[nsyms - ntokens] = ngotos;
d0b0fefa 117 }
d0fb370f 118
5362cd5f
PE
119 CALLOC (from_state, ngotos);
120 CALLOC (to_state, ngotos);
d0fb370f 121
5dde5425 122 for (s = 0; s < nstates; ++s)
d0fb370f 123 {
5dde5425 124 transitions *sp = states[s]->transitions;
d57650a5 125 int i;
ccaf65bc 126 for (i = sp->num - 1; i >= 0 && TRANSITION_IS_GOTO (sp, i); --i)
d0fb370f 127 {
60e3ecc7 128 goto_number k = temp_map[TRANSITION_SYMBOL (sp, i) - ntokens]++;
5dde5425 129 from_state[k] = s;
640748ee 130 to_state[k] = sp->states[i]->number;
d0fb370f
RS
131 }
132 }
133
afbb696d 134 free (temp_map);
d0fb370f
RS
135}
136
137
138
43591cec
AD
139/*----------------------------------------------------------.
140| Map a state/symbol pair into its numeric representation. |
141`----------------------------------------------------------*/
d0fb370f 142
60e3ecc7 143static goto_number
5dde5425 144map_goto (state_number s0, symbol_number sym)
d0fb370f 145{
60e3ecc7
PE
146 goto_number high;
147 goto_number low;
148 goto_number middle;
5dde5425 149 state_number s;
d0fb370f 150
5362cd5f
PE
151 low = goto_map[sym - ntokens];
152 high = goto_map[sym - ntokens + 1] - 1;
d0fb370f 153
58a84254 154 for (;;)
d0fb370f 155 {
58a84254
PE
156 if (high < low)
157 abort ();
d0fb370f
RS
158 middle = (low + high) / 2;
159 s = from_state[middle];
5dde5425 160 if (s == s0)
36281465 161 return middle;
5dde5425 162 else if (s < s0)
d0fb370f
RS
163 low = middle + 1;
164 else
165 high = middle - 1;
166 }
d0fb370f
RS
167}
168
169
4a120d45 170static void
d2729d44 171initialize_F (void)
d0fb370f 172{
5362cd5f
PE
173 goto_number **reads = CALLOC (reads, ngotos);
174 goto_number *edge = CALLOC (edge, ngotos + 1);
60e3ecc7 175 goto_number nedges = 0;
d0fb370f 176
60e3ecc7 177 goto_number i;
d0fb370f 178
914feea9 179 F = bitsetv_create (ngotos, ntokens, BITSET_FIXED);
d0fb370f 180
d0fb370f
RS
181 for (i = 0; i < ngotos; i++)
182 {
5dde5425
PE
183 state_number stateno = to_state[i];
184 transitions *sp = states[stateno]->transitions;
d0fb370f 185
d954473d 186 int j;
640748ee 187 FOR_EACH_SHIFT (sp, j)
ccaf65bc 188 bitset_set (F[i], TRANSITION_SYMBOL (sp, j));
d0fb370f 189
ccaf65bc 190 for (; j < sp->num; j++)
d954473d 191 {
5dde5425 192 symbol_number sym = TRANSITION_SYMBOL (sp, j);
5362cd5f 193 if (nullable[sym - ntokens])
5dde5425 194 edge[nedges++] = map_goto (stateno, sym);
d954473d 195 }
a0f6b076 196
d954473d
AD
197 if (nedges)
198 {
5362cd5f 199 CALLOC (reads[i], nedges + 1);
62a3e4f0 200 memcpy (reads[i], edge, nedges * sizeof (edge[0]));
60e3ecc7 201 reads[i][nedges] = END_NODE;
d954473d 202 nedges = 0;
d0fb370f 203 }
d0fb370f
RS
204 }
205
0e4d5753 206 relation_digraph (reads, ngotos, &F);
d0fb370f
RS
207
208 for (i = 0; i < ngotos; i++)
afbb696d 209 free (reads[i]);
d0fb370f 210
afbb696d
PE
211 free (reads);
212 free (edge);
d0fb370f
RS
213}
214
215
4a120d45 216static void
60e3ecc7 217add_lookback_edge (state *s, rule *r, goto_number gotono)
d0fb370f 218{
5dde5425 219 int ri = state_reduction_find (s, r);
5362cd5f 220 goto_list *sp = MALLOC (sp, 1);
8dd162d3 221 sp->next = lookback[(s->reductions->look_ahead_tokens - LA) + ri];
d0fb370f 222 sp->value = gotono;
8dd162d3 223 lookback[(s->reductions->look_ahead_tokens - LA) + ri] = sp;
d0fb370f
RS
224}
225
226
d0fb370f 227
4a120d45 228static void
720d742f 229build_relations (void)
d0fb370f 230{
5362cd5f
PE
231 goto_number *edge = CALLOC (edge, ngotos + 1);
232 state_number *states1 = CALLOC (states1, ritem_longest_rhs () + 1);
60e3ecc7 233 goto_number i;
720d742f 234
5362cd5f 235 CALLOC (includes, ngotos);
d0fb370f
RS
236
237 for (i = 0; i < ngotos; i++)
238 {
9887c18a 239 int nedges = 0;
5dde5425
PE
240 symbol_number symbol1 = states[to_state[i]]->accessing_symbol;
241 rule **rulep;
d0fb370f 242
5362cd5f 243 for (rulep = derives[symbol1 - ntokens]; *rulep; rulep++)
720d742f 244 {
d0829076 245 bool done;
80a69750 246 int length = 1;
5dde5425
PE
247 item_number *rp;
248 state *s = states[from_state[i]];
249 states1[0] = s->number;
d0fb370f 250
bb0027a9 251 for (rp = (*rulep)->rhs; *rp >= 0; rp++)
720d742f 252 {
5dde5425
PE
253 s = transitions_to (s->transitions,
254 item_number_as_symbol_number (*rp));
255 states1[length++] = s->number;
720d742f
AD
256 }
257
5dde5425
PE
258 if (!s->consistent)
259 add_lookback_edge (s, *rulep, i);
720d742f
AD
260
261 length--;
d0829076 262 done = false;
720d742f
AD
263 while (!done)
264 {
d0829076 265 done = true;
720d742f
AD
266 rp--;
267 /* JF added rp>=ritem && I hope to god its right! */
268 if (rp >= ritem && ISVAR (*rp))
269 {
5dde5425 270 /* Downcasting from item_number to symbol_number. */
5fbb0954 271 edge[nedges++] = map_goto (states1[--length],
a49aecd5 272 item_number_as_symbol_number (*rp));
5362cd5f 273 if (nullable[*rp - ntokens])
d0829076 274 done = false;
720d742f
AD
275 }
276 }
d0fb370f
RS
277 }
278
720d742f
AD
279 if (nedges)
280 {
9887c18a 281 int j;
5362cd5f 282 CALLOC (includes[i], nedges + 1);
720d742f 283 for (j = 0; j < nedges; j++)
80a69750 284 includes[i][j] = edge[j];
60e3ecc7 285 includes[i][nedges] = END_NODE;
720d742f 286 }
d0fb370f
RS
287 }
288
afbb696d
PE
289 free (edge);
290 free (states1);
9887c18a 291
0e4d5753 292 relation_transpose (&includes, ngotos);
d0fb370f
RS
293}
294
295
720d742f 296
4a120d45 297static void
720d742f 298compute_FOLLOWS (void)
d0fb370f 299{
60e3ecc7 300 goto_number i;
d0fb370f 301
0e4d5753 302 relation_digraph (includes, ngotos, &F);
d0fb370f
RS
303
304 for (i = 0; i < ngotos; i++)
afbb696d 305 free (includes[i]);
d0fb370f 306
afbb696d 307 free (includes);
d0fb370f
RS
308}
309
310
4a120d45 311static void
8dd162d3 312compute_look_ahead_tokens (void)
d0fb370f 313{
d200e455 314 size_t i;
5dde5425 315 goto_list *sp;
d0fb370f 316
d200e455 317 for (i = 0; i < nLA; i++)
ddcd5fdf 318 for (sp = lookback[i]; sp; sp = sp->next)
0fb1ffb1 319 bitset_or (LA[i], LA[i], F[sp->value]);
d0fb370f 320
ddcd5fdf 321 /* Free LOOKBACK. */
d200e455 322 for (i = 0; i < nLA; i++)
5dde5425 323 LIST_FREE (goto_list, lookback[i]);
d0fb370f 324
afbb696d 325 free (lookback);
914feea9 326 bitsetv_free (F);
720d742f 327}
d0fb370f 328
d0fb370f 329
8dd162d3
PE
330/*-----------------------------------------------------.
331| Count the number of look-ahead tokens required for S |
332| (N_LOOK_AHEAD_TOKENS member). |
333`-----------------------------------------------------*/
5edafffd 334
cd08e51e 335static int
8dd162d3 336state_look_ahead_tokens_count (state *s)
5edafffd 337{
cd08e51e 338 int k;
8dd162d3 339 int n_look_ahead_tokens = 0;
5dde5425
PE
340 reductions *rp = s->reductions;
341 transitions *sp = s->transitions;
cd08e51e 342
8dd162d3 343 /* We need a look-ahead either to distinguish different
cd08e51e
AD
344 reductions (i.e., there are two or more), or to distinguish a
345 reduction from a shift. Otherwise, it is straightforward,
346 and the state is `consistent'. */
347 if (rp->num > 1
348 || (rp->num == 1 && sp->num &&
349 !TRANSITION_IS_DISABLED (sp, 0) && TRANSITION_IS_SHIFT (sp, 0)))
8dd162d3 350 n_look_ahead_tokens += rp->num;
cd08e51e 351 else
5dde5425 352 s->consistent = 1;
cd08e51e
AD
353
354 for (k = 0; k < sp->num; k++)
355 if (!TRANSITION_IS_DISABLED (sp, k) && TRANSITION_IS_ERROR (sp, k))
356 {
5dde5425 357 s->consistent = 0;
cd08e51e
AD
358 break;
359 }
3877f72b 360
8dd162d3 361 return n_look_ahead_tokens;
5edafffd
AD
362}
363
7c6b64d0 364
8dd162d3
PE
365/*-----------------------------------------------------.
366| Compute LA, NLA, and the look_ahead_tokens members. |
367`-----------------------------------------------------*/
c0263492
AD
368
369static void
cd08e51e 370initialize_LA (void)
c0263492 371{
5dde5425 372 state_number i;
cd08e51e 373 bitsetv pLA;
c0263492 374
8dd162d3 375 /* Compute the total number of reductions requiring a look-ahead. */
cd08e51e
AD
376 nLA = 0;
377 for (i = 0; i < nstates; i++)
8dd162d3 378 nLA += state_look_ahead_tokens_count (states[i]);
cd08e51e
AD
379 /* Avoid having to special case 0. */
380 if (!nLA)
381 nLA = 1;
382
383 pLA = LA = bitsetv_create (nLA, ntokens, BITSET_FIXED);
5362cd5f 384 CALLOC (lookback, nLA);
cd08e51e 385
8dd162d3
PE
386 /* Initialize the members LOOK_AHEAD_TOKENS for each state whose reductions
387 require look-ahead tokens. */
c0263492
AD
388 for (i = 0; i < nstates; i++)
389 {
8dd162d3 390 int count = state_look_ahead_tokens_count (states[i]);
cd08e51e
AD
391 if (count)
392 {
8dd162d3 393 states[i]->reductions->look_ahead_tokens = pLA;
cd08e51e
AD
394 pLA += count;
395 }
c0263492
AD
396 }
397}
398
399
8dd162d3
PE
400/*----------------------------------------------.
401| Output the look-ahead tokens for each state. |
402`----------------------------------------------*/
7c6b64d0
AD
403
404static void
8dd162d3 405look_ahead_tokens_print (FILE *out)
7c6b64d0 406{
5dde5425 407 state_number i;
602bbf31 408 int j, k;
8dd162d3 409 fprintf (out, "Look-ahead tokens: BEGIN\n");
7c6b64d0
AD
410 for (i = 0; i < nstates; ++i)
411 {
5dde5425 412 reductions *reds = states[i]->reductions;
613f5e1a 413 bitset_iterator iter;
8dd162d3 414 int n_look_ahead_tokens = 0;
cd08e51e 415
8dd162d3 416 if (reds->look_ahead_tokens)
cd08e51e 417 for (k = 0; k < reds->num; ++k)
8dd162d3
PE
418 if (reds->look_ahead_tokens[k])
419 ++n_look_ahead_tokens;
613f5e1a 420
8dd162d3
PE
421 fprintf (out, "State %d: %d look-ahead tokens\n",
422 i, n_look_ahead_tokens);
7c6b64d0 423
8dd162d3 424 if (reds->look_ahead_tokens)
cd08e51e 425 for (j = 0; j < reds->num; ++j)
8dd162d3 426 BITSET_FOR_EACH (iter, reds->look_ahead_tokens[j], k, 0)
cd08e51e 427 {
427c0dda 428 fprintf (out, " on %d (%s) -> rule %d\n",
cd08e51e
AD
429 k, symbols[k]->tag,
430 reds->rules[j]->number);
431 };
7c6b64d0 432 }
8dd162d3 433 fprintf (out, "Look-ahead tokens: END\n");
7c6b64d0
AD
434}
435
720d742f
AD
436void
437lalr (void)
438{
720d742f
AD
439 initialize_LA ();
440 set_goto_map ();
441 initialize_F ();
442 build_relations ();
443 compute_FOLLOWS ();
8dd162d3 444 compute_look_ahead_tokens ();
7c6b64d0 445
273a74fa 446 if (trace_flag & trace_sets)
8dd162d3 447 look_ahead_tokens_print (stderr);
d0fb370f 448}
3325ddc4
AD
449
450
451void
452lalr_free (void)
453{
5dde5425 454 state_number s;
3325ddc4 455 for (s = 0; s < nstates; ++s)
8dd162d3 456 states[s]->reductions->look_ahead_tokens = NULL;
3325ddc4 457 bitsetv_free (LA);
3325ddc4 458}