1cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Closures for Bison 2cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 3cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project Copyright (C) 1984, 1989, 2000, 2001, 2002, 2004, 2005 Free 4cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project Software Foundation, Inc. 5cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 6cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project This file is part of Bison, the GNU Compiler Compiler. 7cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 8cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project Bison is free software; you can redistribute it and/or modify it 9cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project under the terms of the GNU General Public License as published by 10cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project the Free Software Foundation; either version 2, or (at your option) 11cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project any later version. 12cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 13cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project Bison is distributed in the hope that it will be useful, but 14cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project WITHOUT ANY WARRANTY; without even the implied warranty of 15cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project General Public License for more details. 17cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 18cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project You should have received a copy of the GNU General Public License 19cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project along with Bison; see the file COPYING. If not, write to the Free 20cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 21cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 02110-1301, USA. */ 22cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 23cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <config.h> 24cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "system.h" 25cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 26cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <bitset.h> 27cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <bitsetv-print.h> 28cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <bitsetv.h> 29cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <quotearg.h> 30cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 31cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "closure.h" 32cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "derives.h" 33cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "getargs.h" 34cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "gram.h" 35cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "reader.h" 36cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "symtab.h" 37cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 38cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* NITEMSET is the size of the array ITEMSET. */ 39cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectitem_number *itemset; 40cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsize_t nritemset; 41cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 42cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic bitset ruleset; 43cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 44cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* internal data. See comments before set_fderives and set_firsts. */ 45cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic bitsetv fderives = NULL; 46cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic bitsetv firsts = NULL; 47cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 48cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Retrieve the FDERIVES/FIRSTS sets of the nonterminals numbered Var. */ 49cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define FDERIVES(Var) fderives[(Var) - ntokens] 50cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define FIRSTS(Var) firsts[(Var) - ntokens] 51cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 52cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 53cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*-----------------. 54cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Debugging code. | 55cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`-----------------*/ 56cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 57cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void 58cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprint_closure (char const *title, item_number *array, size_t size) 59cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 60cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project size_t i; 61cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (stderr, "Closure: %s\n", title); 62cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (i = 0; i < size; ++i) 63cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 64cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project item_number *rp; 65cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (stderr, " %2d: .", array[i]); 66cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (rp = &ritem[array[i]]; *rp >= 0; ++rp) 67cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (stderr, " %s", symbols[*rp]->tag); 68cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (stderr, " (rule %d)\n", -*rp - 1); 69cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 70cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fputs ("\n\n", stderr); 71cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 72cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 73cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 74cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void 75cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprint_firsts (void) 76cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 77cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project symbol_number i, j; 78cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 79cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (stderr, "FIRSTS\n"); 80cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (i = ntokens; i < nsyms; i++) 81cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 82cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project bitset_iterator iter; 83cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (stderr, "\t%s firsts\n", symbols[i]->tag); 84cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project BITSET_FOR_EACH (iter, FIRSTS (i), j, 0) 85cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 86cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (stderr, "\t\t%s\n", 87cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project symbols[j + ntokens]->tag); 88cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 89cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 90cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (stderr, "\n\n"); 91cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 92cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 93cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 94cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void 95cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprint_fderives (void) 96cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 97cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int i; 98cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project rule_number r; 99cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 100cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (stderr, "FDERIVES\n"); 101cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (i = ntokens; i < nsyms; i++) 102cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 103cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project bitset_iterator iter; 104cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (stderr, "\t%s derives\n", symbols[i]->tag); 105cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project BITSET_FOR_EACH (iter, FDERIVES (i), r, 0) 106cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 107cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (stderr, "\t\t%3d ", r); 108cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project rule_rhs_print (&rules[r], stderr); 109cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 110cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 111cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (stderr, "\n\n"); 112cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 113cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 114cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*------------------------------------------------------------------. 115cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Set FIRSTS to be an NVARS array of NVARS bitsets indicating which | 116cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| items can represent the beginning of the input corresponding to | 117cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| which other items. | 118cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| | 119cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| For example, if some rule expands symbol 5 into the sequence of | 120cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| symbols 8 3 20, the symbol 8 can be the beginning of the data for | 121cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| symbol 5, so the bit [8 - ntokens] in first[5 - ntokens] (= FIRST | 122cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| (5)) is set. | 123cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`------------------------------------------------------------------*/ 124cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 125cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void 126cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectset_firsts (void) 127cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 128cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project symbol_number i, j; 129cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 130cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project firsts = bitsetv_create (nvars, nvars, BITSET_FIXED); 131cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 132cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (i = ntokens; i < nsyms; i++) 133cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (j = 0; derives[i - ntokens][j]; ++j) 134cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 135cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project item_number sym = derives[i - ntokens][j]->rhs[0]; 136cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (ISVAR (sym)) 137cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project bitset_set (FIRSTS (i), sym - ntokens); 138cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 139cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 140cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (trace_flag & trace_sets) 141cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project bitsetv_matrix_dump (stderr, "RTC: Firsts Input", firsts); 142cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project bitsetv_reflexive_transitive_closure (firsts); 143cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (trace_flag & trace_sets) 144cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project bitsetv_matrix_dump (stderr, "RTC: Firsts Output", firsts); 145cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 146cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (trace_flag & trace_sets) 147cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project print_firsts (); 148cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 149cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 150cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*-------------------------------------------------------------------. 151cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Set FDERIVES to an NVARS by NRULES matrix of bits indicating which | 152cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| rules can help derive the beginning of the data for each | 153cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| nonterminal. | 154cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| | 155cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| For example, if symbol 5 can be derived as the sequence of symbols | 156cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| 8 3 20, and one of the rules for deriving symbol 8 is rule 4, then | 157cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| the [5 - NTOKENS, 4] bit in FDERIVES is set. | 158cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`-------------------------------------------------------------------*/ 159cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 160cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void 161cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectset_fderives (void) 162cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 163cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project symbol_number i, j; 164cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project rule_number k; 165cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 166cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fderives = bitsetv_create (nvars, nrules, BITSET_FIXED); 167cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 168cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project set_firsts (); 169cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 170cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (i = ntokens; i < nsyms; ++i) 171cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (j = ntokens; j < nsyms; ++j) 172cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (bitset_test (FIRSTS (i), j - ntokens)) 173cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (k = 0; derives[j - ntokens][k]; ++k) 174cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project bitset_set (FDERIVES (i), derives[j - ntokens][k]->number); 175cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 176cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (trace_flag & trace_sets) 177cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project print_fderives (); 178cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 179cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project bitsetv_free (firsts); 180cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 181cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 182cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 183cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 184cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid 185cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectnew_closure (unsigned int n) 186cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 187cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project itemset = xnmalloc (n, sizeof *itemset); 188cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 189cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project ruleset = bitset_create (nrules, BITSET_FIXED); 190cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 191cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project set_fderives (); 192cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 193cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 194cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 195cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 196cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid 197cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectclosure (item_number *core, size_t n) 198cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 199cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Index over CORE. */ 200cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project size_t c; 201cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 202cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* A bit index over RULESET. */ 203cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project rule_number ruleno; 204cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 205cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project bitset_iterator iter; 206cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 207cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (trace_flag & trace_sets) 208cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project print_closure ("input", core, n); 209cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 210cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project bitset_zero (ruleset); 211cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 212cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (c = 0; c < n; ++c) 213cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (ISVAR (ritem[core[c]])) 214cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project bitset_or (ruleset, ruleset, FDERIVES (ritem[core[c]])); 215cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 216cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project nritemset = 0; 217cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project c = 0; 218cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project BITSET_FOR_EACH (iter, ruleset, ruleno, 0) 219cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 220cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project item_number itemno = rules[ruleno].rhs - ritem; 221cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project while (c < n && core[c] < itemno) 222cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 223cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project itemset[nritemset] = core[c]; 224cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project nritemset++; 225cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project c++; 226cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 227cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project itemset[nritemset] = itemno; 228cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project nritemset++; 229cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project }; 230cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 231cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project while (c < n) 232cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 233cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project itemset[nritemset] = core[c]; 234cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project nritemset++; 235cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project c++; 236cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 237cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 238cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (trace_flag & trace_sets) 239cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project print_closure ("output", itemset, nritemset); 240cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 241cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 242cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 243cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid 244cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfree_closure (void) 245cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 246cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project free (itemset); 247cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project bitset_free (ruleset); 248cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project bitsetv_free (fderives); 249cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 250