]>
git.saurik.com Git - bison.git/blob - src/lalr.c
c16c6f52dafaea945a222c3f6103f32c6c312cf2
   1 /* Compute look-ahead criteria for bison, 
   2    Copyright 1984, 1986, 1989, 2000, 2001  Free Software Foundation, Inc. 
   4    This file is part of Bison, the GNU Compiler Compiler. 
   6    Bison is free software; you can redistribute it and/or modify 
   7    it under the terms of the GNU General Public License as published by 
   8    the Free Software Foundation; either version 2, or (at your option) 
  11    Bison is distributed in the hope that it will be useful, 
  12    but WITHOUT ANY WARRANTY; without even the implied warranty of 
  13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
  14    GNU General Public License for more details. 
  16    You should have received a copy of the GNU General Public License 
  17    along with Bison; see the file COPYING.  If not, write to 
  18    the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 
  19    Boston, MA 02111-1307, USA.  */ 
  22 /* Compute how to make the finite state machine deterministic; find 
  23    which rules need lookahead in each state, and which lookahead 
  24    tokens they accept.  */ 
  38 /* All the decorated states, indexed by the state number.  */ 
  39 state_t 
**states 
= NULL
; 
  51 /* And for the famous F variable, which name is so descriptive that a 
  52    comment is hardly needed.  <grin>.  */ 
  53 static unsigned *F 
= NULL
; 
  54 #define F(Rule)  (F + (Rule) * tokensetsize) 
  56 static short **includes
; 
  57 static shorts 
**lookback
; 
  60 /*---------------------------------------------------------------. 
  61 | digraph & traverse.                                            | 
  63 | The following variables are used as common storage between the | 
  65 `---------------------------------------------------------------*/ 
  69 static short *VERTICES
; 
  79   size_t size 
= F (i 
+ 1) - F(i
); 
  82   INDEX
[i
] = height 
= top
; 
  85     for (j 
= 0; R
[i
][j
] >= 0; ++j
) 
  87         if (INDEX
[R
[i
][j
]] == 0) 
  90         if (INDEX
[i
] > INDEX
[R
[i
][j
]]) 
  91           INDEX
[i
] = INDEX
[R
[i
][j
]]; 
  93         for (k 
= 0; k 
< size
; ++k
) 
  94           F (i
)[k
] |= F (R
[i
][j
])[k
]; 
  97   if (INDEX
[i
] == height
) 
 106         for (k 
= 0; k 
< size
; ++k
) 
 113 digraph (short **relation
) 
 117   infinity 
= ngotos 
+ 2; 
 118   INDEX 
= XCALLOC (short, ngotos 
+ 1); 
 119   VERTICES 
= XCALLOC (short, ngotos 
+ 1); 
 124   for (i 
= 0; i 
< ngotos
; i
++) 
 127   for (i 
= 0; i 
< ngotos
; i
++) 
 128     if (INDEX
[i
] == 0 && R
[i
]) 
 143   /* Avoid having to special case 0.  */ 
 147   LA 
= XCALLOC (unsigned, nLA 
* tokensetsize
); 
 148   LAruleno 
= XCALLOC (short, nLA
); 
 149   lookback 
= XCALLOC (shorts 
*, nLA
); 
 152   for (i 
= 0; i 
< nstates
; i
++) 
 153     if (!states
[i
]->consistent
) 
 154       for (j 
= 0; j 
< states
[i
]->reductions
->nreds
; j
++) 
 155         *np
++ = states
[i
]->reductions
->rules
[j
]; 
 165   goto_map 
= XCALLOC (short, nvars 
+ 1) - ntokens
; 
 166   temp_map 
= XCALLOC (short, nvars 
+ 1) - ntokens
; 
 169   for (state 
= 0; state 
< nstates
; ++state
) 
 171       shifts 
*sp 
= states
[state
]->shifts
; 
 172       for (i 
= sp
->nshifts 
- 1; i 
>= 0 && SHIFT_IS_GOTO (sp
, i
); --i
) 
 174           if (ngotos 
== MAXSHORT
) 
 175             fatal (_("too many gotos (max %d)"), MAXSHORT
); 
 178           goto_map
[SHIFT_SYMBOL (sp
, i
)]++; 
 184     for (i 
= ntokens
; i 
< nsyms
; i
++) 
 190     for (i 
= ntokens
; i 
< nsyms
; i
++) 
 191       goto_map
[i
] = temp_map
[i
]; 
 193     goto_map
[nsyms
] = ngotos
; 
 194     temp_map
[nsyms
] = ngotos
; 
 197   from_state 
= XCALLOC (short, ngotos
); 
 198   to_state 
= XCALLOC (short, ngotos
); 
 200   for (state 
= 0; state 
< nstates
; ++state
) 
 202       shifts 
*sp 
= states
[state
]->shifts
; 
 203       for (i 
= sp
->nshifts 
- 1; i 
>= 0 && SHIFT_IS_GOTO (sp
, i
); --i
) 
 205           int k 
= temp_map
[SHIFT_SYMBOL (sp
, i
)]++; 
 206           from_state
[k
] = state
; 
 207           to_state
[k
] = sp
->shifts
[i
]; 
 211   XFREE (temp_map 
+ ntokens
); 
 216 /*----------------------------------------------------------. 
 217 | Map a state/symbol pair into its numeric representation.  | 
 218 `----------------------------------------------------------*/ 
 221 map_goto (int state
, int symbol
) 
 228   low 
= goto_map
[symbol
]; 
 229   high 
= goto_map
[symbol 
+ 1] - 1; 
 233       middle 
= (low 
+ high
) / 2; 
 234       s 
= from_state
[middle
]; 
 252   short **reads 
= XCALLOC (short *, ngotos
); 
 253   short *edge 
= XCALLOC (short, ngotos 
+ 1); 
 258   F 
= XCALLOC (unsigned, ngotos 
* tokensetsize
); 
 260   for (i 
= 0; i 
< ngotos
; i
++) 
 262       int stateno 
= to_state
[i
]; 
 263       shifts 
*sp 
= states
[stateno
]->shifts
; 
 266       for (j 
= 0; j 
< sp
->nshifts 
&& SHIFT_IS_SHIFT (sp
, j
); j
++) 
 267         SETBIT (F (i
), SHIFT_SYMBOL (sp
, j
)); 
 269       for (; j 
< sp
->nshifts
; j
++) 
 271           int symbol 
= SHIFT_SYMBOL (sp
, j
); 
 272           if (nullable
[symbol
]) 
 273             edge
[nedges
++] = map_goto (stateno
, symbol
); 
 278           reads
[i
] = XCALLOC (short, nedges 
+ 1); 
 279           shortcpy (reads
[i
], edge
, nedges
); 
 280           reads
[i
][nedges
] = -1; 
 287   for (i 
= 0; i 
< ngotos
; i
++) 
 296 add_lookback_edge (state_t 
*state
, int ruleno
, int gotono
) 
 301   for (i 
= 0; i 
< state
->nlookaheads
; ++i
) 
 302     if (LAruleno
[state
->lookaheadsp 
+ i
] == ruleno
) 
 305   assert (LAruleno
[state
->lookaheadsp 
+ i
] == ruleno
); 
 307   sp 
= XCALLOC (shorts
, 1); 
 308   sp
->next 
= lookback
[state
->lookaheadsp 
+ i
]; 
 310   lookback
[state
->lookaheadsp 
+ i
] = sp
; 
 315 matrix_print (FILE *out
, short **matrix
, int n
) 
 319   for (i 
= 0; i 
< n
; ++i
) 
 321       fprintf (out
, "%3d: ", i
); 
 323         for (j 
= 0; matrix
[i
][j
] != -1; ++j
) 
 324           fprintf (out
, "%3d ", matrix
[i
][j
]); 
 330 /*-------------------------------------------------------------------. 
 331 | Return the transpose of R_ARG, of size N.  Destroy R_ARG, as it is | 
 332 | replaced with the result.                                          | 
 334 | R_ARG[I] is NULL or a -1 terminated list of numbers.               | 
 336 | RESULT[NUM] is NULL or the -1 terminated list of the I such as NUM | 
 338 `-------------------------------------------------------------------*/ 
 341 transpose (short **R_arg
, int n
) 
 344   short **new_R 
= XCALLOC (short *, n
); 
 345   /* END_R[I] -- next entry of NEW_R[I]. */ 
 346   short **end_R 
= XCALLOC (short *, n
); 
 347   /* NEDGES[I] -- total size of NEW_R[I]. */ 
 348   short *nedges 
= XCALLOC (short, n
); 
 353       fputs ("transpose: input\n", stderr
); 
 354       matrix_print (stderr
, R_arg
, n
); 
 358   for (i 
= 0; i 
< n
; i
++) 
 360       for (j 
= 0; R_arg
[i
][j
] >= 0; ++j
) 
 361         ++nedges
[R_arg
[i
][j
]]; 
 364   for (i 
= 0; i 
< n
; i
++) 
 367         short *sp 
= XCALLOC (short, nedges
[i
] + 1); 
 374   for (i 
= 0; i 
< n
; i
++) 
 376       for (j 
= 0; R_arg
[i
][j
] >= 0; ++j
) 
 378           *end_R
[R_arg
[i
][j
]] = i
; 
 379           ++end_R
[R_arg
[i
][j
]]; 
 385   /* Free the input: it is replaced with the result. */ 
 386   for (i 
= 0; i 
< n
; i
++) 
 392       fputs ("transpose: output\n", stderr
); 
 393       matrix_print (stderr
, new_R
, n
); 
 401 build_relations (void) 
 403   short *edge 
= XCALLOC (short, ngotos 
+ 1); 
 404   short *states1 
= XCALLOC (short, ritem_longest_rhs () + 1); 
 407   includes 
= XCALLOC (short *, ngotos
); 
 409   for (i 
= 0; i 
< ngotos
; i
++) 
 412       int symbol1 
= states
[to_state
[i
]]->accessing_symbol
; 
 415       for (rulep 
= derives
[symbol1
]; *rulep 
> 0; rulep
++) 
 420           state_t 
*state 
= states
[from_state
[i
]]; 
 421           states1
[0] = state
->number
; 
 423           for (rp 
= &ritem
[rules
[*rulep
].rhs
]; *rp 
>= 0; rp
++) 
 425               shifts 
*sp 
= state
->shifts
; 
 427               for (j 
= 0; j 
< sp
->nshifts
; j
++) 
 429                   state 
= states
[sp
->shifts
[j
]]; 
 430                   if (state
->accessing_symbol 
== *rp
) 
 434               states1
[length
++] = state
->number
; 
 437           if (!state
->consistent
) 
 438             add_lookback_edge (state
, *rulep
, i
); 
 446               /* JF added rp>=ritem &&   I hope to god its right! */ 
 447               if (rp 
>= ritem 
&& ISVAR (*rp
)) 
 449                   edge
[nedges
++] = map_goto (states1
[--length
], *rp
); 
 459           includes
[i
] = XCALLOC (short, nedges 
+ 1); 
 460           for (j 
= 0; j 
< nedges
; j
++) 
 461             includes
[i
][j
] = edge
[j
]; 
 462           includes
[i
][nedges
] = -1; 
 469   includes 
= transpose (includes
, ngotos
); 
 475 compute_FOLLOWS (void) 
 481   for (i 
= 0; i 
< ngotos
; i
++) 
 489 compute_lookaheads (void) 
 494   for (i 
= 0; i 
< nLA
; i
++) 
 495     for (sp 
= lookback
[i
]; sp
; sp 
= sp
->next
) 
 497         int size 
= LA (i 
+ 1) - LA (i
); 
 499         for (j 
= 0; j 
< size
; ++j
) 
 500           LA (i
)[j
] |= F (sp
->value
)[j
]; 
 504   for (i 
= 0; i 
< nLA
; i
++) 
 505     LIST_FREE (shorts
, lookback
[i
]); 
 512 /*--------------------------------------. 
 513 | Initializing the lookaheads members.  | 
 514 `--------------------------------------*/ 
 517 initialize_lookaheads (void) 
 521   for (i 
= 0; i 
< nstates
; i
++) 
 525       reductions 
*rp 
= states
[i
]->reductions
; 
 526       shifts 
*sp 
= states
[i
]->shifts
; 
 528       /* We need a lookahead either to distinguish different 
 529          reductions (i.e., there are two or more), or to distinguish a 
 530          reduction from a shift.  Otherwise, it is straightforward, 
 531          and the state is `consistent'.  */ 
 533           || (rp
->nreds 
== 1 && sp
->nshifts 
&& SHIFT_IS_SHIFT (sp
, 0))) 
 534         nlookaheads 
+= rp
->nreds
; 
 536         states
[i
]->consistent 
= 1; 
 538       for (k 
= 0; k 
< sp
->nshifts
; k
++) 
 539         if (SHIFT_IS_ERROR (sp
, k
)) 
 541             states
[i
]->consistent 
= 0; 
 545       states
[i
]->nlookaheads 
= nlookaheads
; 
 546       states
[i
]->lookaheadsp 
= nLA
; 
 552 /*---------------------------------------. 
 553 | Output the lookaheads for each state.  | 
 554 `---------------------------------------*/ 
 557 lookaheads_print (FILE *out
) 
 560   fprintf (out
, "Lookaheads: BEGIN\n"); 
 561   for (i 
= 0; i 
< nstates
; ++i
) 
 563       fprintf (out
, "State %d: %d lookaheads\n", 
 564                i
, states
[i
]->nlookaheads
); 
 566       for (j 
= 0; j 
< states
[i
]->nlookaheads
; ++j
) 
 567         for (k 
= 0; k 
< ntokens
; ++k
) 
 568           if (BITISSET (LA (states
[i
]->lookaheadsp 
+ j
), j
)) 
 569             fprintf (out
, "   on %d (%s) -> rule %d\n", 
 571                      -LAruleno
[states
[i
]->lookaheadsp 
+ j
] - 1); 
 573   fprintf (out
, "Lookaheads: END\n"); 
 579   tokensetsize 
= WORDSIZE (ntokens
); 
 581   initialize_lookaheads (); 
 587   compute_lookaheads (); 
 590     lookaheads_print (stderr
);