]>
git.saurik.com Git - bison.git/blob - src/closure.c
03222cac8cc34015d384d9cca692d8f926fceed8
   1 /* Subroutines for bison 
   2    Copyright 1984, 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 it 
   7    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, but 
  12    WITHOUT ANY WARRANTY; without even the implied warranty of 
  13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
  14    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 the Free 
  18    Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 
  31 /* NITEMSET is the size of the array ITEMSET.  */ 
  35 static bitset ruleset
; 
  37 /* internal data.  See comments before set_fderives and set_firsts.  */ 
  38 static bitset 
*fderives
; 
  39 static unsigned int *firsts
; 
  41 /* Retrieve the FDERIVES/FIRSTS sets of the nonterminals numbered Var.  */ 
  42 #define FDERIVES(Var)   fderives[(Var) - ntokens] 
  43 #define   FIRSTS(Var)   (firsts   + ((Var) - ntokens) * varsetsize) 
  45 /* number of words required to hold a bit for each variable */ 
  46 static int varsetsize
; 
  54 print_closure (const char *title
, short *array
, size_t size
) 
  57   fprintf (stderr
, "Closure: %s\n", title
); 
  58   for (i 
= 0; i 
< size
; ++i
) 
  61       fprintf (stderr
, "  %2d: .", array
[i
]); 
  62       for (rp 
= &ritem
[array
[i
]]; *rp 
>= 0; ++rp
) 
  63         fprintf (stderr
, " %s", symbols
[*rp
]->tag
); 
  64       fprintf (stderr
, "  (rule %d)\n", -*rp 
- 1); 
  66   fputs ("\n\n", stderr
); 
  75   fprintf (stderr
, "FIRSTS\n"); 
  76   for (i 
= ntokens
; i 
< nsyms
; i
++) 
  78       fprintf (stderr
, "\t%s firsts\n", symbols
[i
]->tag
); 
  79       for (j 
= 0; j 
< nvars
; j
++) 
  80         if (BITISSET (FIRSTS (i
), j
)) 
  81           fprintf (stderr
, "\t\t%d (%s)\n", 
  82                    j 
+ ntokens
, symbols
[j 
+ ntokens
]->tag
); 
  84   fprintf (stderr
, "\n\n"); 
  94   fprintf (stderr
, "FDERIVES\n"); 
  96   for (i 
= ntokens
; i 
< nsyms
; i
++) 
  98       fprintf (stderr
, "\t%s derives\n", symbols
[i
]->tag
); 
  99       for (j 
= 0; j 
<= nrules
; j
++) 
 100         if (bitset_test (FDERIVES (i
), j
)) 
 103             fprintf (stderr
, "\t\t%d:", j 
- 1); 
 104             for (rhsp 
= &ritem
[rules
[j
].rhs
]; *rhsp 
>= 0; ++rhsp
) 
 105               fprintf (stderr
, " %s", symbols
[*rhsp
]->tag
); 
 106             fputc ('\n', stderr
); 
 109   fprintf (stderr
, "\n\n"); 
 112 /*-------------------------------------------------------------------. 
 113 | Set FIRSTS to be an NVARS by NVARS bit matrix indicating which     | 
 114 | items can represent the beginning of the input corresponding to    | 
 115 | which other items.                                                 | 
 117 | For example, if some rule expands symbol 5 into the sequence of    | 
 118 | symbols 8 3 20, the symbol 8 can be the beginning of the data for  | 
 119 | symbol 5, so the bit [8 - ntokens, 5 - ntokens] in firsts is set.  | 
 120 `-------------------------------------------------------------------*/ 
 127   varsetsize 
= WORDSIZE (nvars
); 
 129   firsts 
= XCALLOC (unsigned, nvars 
* varsetsize
); 
 131   for (i 
= ntokens
; i 
< nsyms
; i
++) 
 132     for (j 
= 0; derives
[i
][j
] >= 0; ++j
) 
 134         int symbol 
= ritem
[rules
[derives
[i
][j
]].rhs
]; 
 136           SETBIT (FIRSTS (i
), symbol 
- ntokens
); 
 145 /*-------------------------------------------------------------------. 
 146 | Set FDERIVES to an NVARS by NRULES matrix of bits indicating which | 
 147 | rules can help derive the beginning of the data for each           | 
 150 | For example, if symbol 5 can be derived as the sequence of symbols | 
 151 | 8 3 20, and one of the rules for deriving symbol 8 is rule 4, then | 
 152 | the [5 - NTOKENS, 4] bit in FDERIVES is set.                       | 
 153 `-------------------------------------------------------------------*/ 
 160   fderives 
= XCALLOC (bitset
, nvars
); 
 161   bitset_stats_init (); 
 162   for (i 
= 0 ; i 
< nvars
; ++i
) 
 164       fderives
[i
] = bitset_create (nrules 
+ 1, BITSET_FIXED
); 
 165       bitset_zero (fderives
[i
]); 
 170   for (i 
= ntokens
; i 
< nsyms
; ++i
) 
 171     for (j 
= ntokens
; j 
< nsyms
; ++j
) 
 172       if (BITISSET (FIRSTS (i
), j 
- ntokens
)) 
 173         for (k 
= 0; derives
[j
][k
] > 0; ++k
) 
 174           bitset_set (FDERIVES (i
), derives
[j
][k
]); 
 186   itemset 
= XCALLOC (short, n
); 
 188   ruleset 
= bitset_create (nrules 
+ 1, BITSET_FIXED
); 
 189   bitset_zero (ruleset
); 
 197 closure (short *core
, int n
) 
 199   /* Index over CORE. */ 
 202   /* An index over RULESET. */ 
 205   /* A bit index over RULESET. */ 
 209     print_closure ("input", core
, n
); 
 213       bitset_copy (ruleset
, FDERIVES (start_symbol
)); 
 217       bitset_zero (ruleset
); 
 219       for (c 
= 0; c 
< n
; ++c
) 
 220         if (ISVAR (ritem
[core
[c
]])) 
 221           bitset_or (ruleset
, ruleset
, FDERIVES (ritem
[core
[c
]])); 
 226   for (ruleno 
= 0; ruleno 
< nrules 
+ 1; ++ruleno
) 
 227     if (bitset_test (ruleset
, ruleno
)) 
 229         int itemno 
= rules
[ruleno
].rhs
; 
 230         while (c 
< n 
&& core
[c
] < itemno
) 
 232             itemset
[nitemset
] = core
[c
]; 
 236         itemset
[nitemset
] = itemno
; 
 242       itemset
[nitemset
] = core
[c
]; 
 248     print_closure ("output", itemset
, nitemset
); 
 258   bitset_free (ruleset
); 
 260   for (i 
= 0 ; i 
< nvars
; ++i
) 
 261     bitset_free (fderives
[i
]);