105436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Type definitions for the finite state machine for Bison.
2cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Copyright (C) 2001-2007, 2009-2012 Free Software Foundation, Inc.
4cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   This file is part of Bison, the GNU Compiler Compiler.
6cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   This program is free software: you can redistribute it and/or modify
8cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   it under the terms of the GNU General Public License as published by
905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   the Free Software Foundation, either version 3 of the License, or
1005436638acc7c010349a69c3395f1a57c642dc62Ying Wang   (at your option) any later version.
11cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   This program is distributed in the hope that it will be useful,
13cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   but WITHOUT ANY WARRANTY; without even the implied warranty of
14cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   GNU General Public License for more details.
16cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
17cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   You should have received a copy of the GNU General Public License
1805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
19cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
20cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <config.h>
21cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "system.h"
22cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
23cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <hash.h>
24cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
25cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "complain.h"
26cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "gram.h"
27cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "state.h"
2805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include "print-xml.h"
29cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
30cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
31cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project			/*-------------------.
32cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project			| Shifts and Gotos.  |
33cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project			`-------------------*/
34cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
35cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
36cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*-----------------------------------------.
37cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Create a new array of NUM shifts/gotos.  |
38cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`-----------------------------------------*/
39cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
40cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic transitions *
41cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttransitions_new (int num, state **the_states)
42cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
43cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  size_t states_size = num * sizeof *the_states;
44cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  transitions *res = xmalloc (offsetof (transitions, states) + states_size);
45cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  res->num = num;
46cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  memcpy (res->states, the_states, states_size);
47cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return res;
48cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
49cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
50cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
51cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*-------------------------------------------------------.
52cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Return the state such that SHIFTS contain a shift/goto |
53cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| to it on SYM.  Abort if none found.                    |
54cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`-------------------------------------------------------*/
55cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
56cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstate *
57cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttransitions_to (transitions *shifts, symbol_number sym)
58cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
59cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int j;
60cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (j = 0; ; j++)
61cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
6205436638acc7c010349a69c3395f1a57c642dc62Ying Wang      aver (j < shifts->num);
63cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      if (TRANSITION_SYMBOL (shifts, j) == sym)
64cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	return shifts->states[j];
65cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
66cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
67cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
68cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
69cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project			/*--------------------.
70cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project			| Error transitions.  |
71cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project			`--------------------*/
72cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
73cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
74cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*---------------------------------.
75cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Create a new array of NUM errs.  |
76cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`---------------------------------*/
77cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
78cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecterrs *
79cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecterrs_new (int num, symbol **tokens)
80cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
81cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  size_t symbols_size = num * sizeof *tokens;
82cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  errs *res = xmalloc (offsetof (errs, symbols) + symbols_size);
83cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  res->num = num;
84cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  memcpy (res->symbols, tokens, symbols_size);
85cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return res;
86cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
87cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
88cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
89cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
90cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
91cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project			/*-------------.
92cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project			| Reductions.  |
93cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project			`-------------*/
94cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
95cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
96cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*---------------------------------------.
97cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Create a new array of NUM reductions.  |
98cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`---------------------------------------*/
99cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
100cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic reductions *
101cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectreductions_new (int num, rule **reds)
102cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
103cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  size_t rules_size = num * sizeof *reds;
104cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  reductions *res = xmalloc (offsetof (reductions, rules) + rules_size);
105cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  res->num = num;
10605436638acc7c010349a69c3395f1a57c642dc62Ying Wang  res->lookahead_tokens = NULL;
107cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  memcpy (res->rules, reds, rules_size);
108cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return res;
109cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
110cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
111cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
112cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
113cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project			/*---------.
114cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project			| States.  |
115cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project			`---------*/
116cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
117cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
118cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstate_number nstates = 0;
119cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* FINAL_STATE is properly set by new_state when it recognizes its
120cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   accessing symbol: $end.  */
121cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstate *final_state = NULL;
122cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
123cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
124cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*------------------------------------------------------------------.
125cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Create a new state with ACCESSING_SYMBOL, for those items.  Store |
126cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| it in the state hash table.                                       |
127cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`------------------------------------------------------------------*/
128cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
129cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstate *
130cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstate_new (symbol_number accessing_symbol,
131cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	   size_t nitems, item_number *core)
132cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
133cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  state *res;
134cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  size_t items_size = nitems * sizeof *core;
135cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
13605436638acc7c010349a69c3395f1a57c642dc62Ying Wang  aver (nstates < STATE_NUMBER_MAXIMUM);
137cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
138cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  res = xmalloc (offsetof (state, items) + items_size);
139cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  res->number = nstates++;
140cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  res->accessing_symbol = accessing_symbol;
141cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  res->transitions = NULL;
142cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  res->reductions = NULL;
143cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  res->errs = NULL;
14405436638acc7c010349a69c3395f1a57c642dc62Ying Wang  res->state_list = NULL;
145cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  res->consistent = 0;
146cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  res->solved_conflicts = NULL;
14705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  res->solved_conflicts_xml = NULL;
148cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
149cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  res->nitems = nitems;
150cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  memcpy (res->items, core, items_size);
151cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
152cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  state_hash_insert (res);
153cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
154cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return res;
155cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
156cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
15705436638acc7c010349a69c3395f1a57c642dc62Ying Wangstate *
15805436638acc7c010349a69c3395f1a57c642dc62Ying Wangstate_new_isocore (state const *s)
15905436638acc7c010349a69c3395f1a57c642dc62Ying Wang{
16005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  state *res;
16105436638acc7c010349a69c3395f1a57c642dc62Ying Wang  size_t items_size = s->nitems * sizeof *s->items;
16205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
16305436638acc7c010349a69c3395f1a57c642dc62Ying Wang  aver (nstates < STATE_NUMBER_MAXIMUM);
16405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
16505436638acc7c010349a69c3395f1a57c642dc62Ying Wang  res = xmalloc (offsetof (state, items) + items_size);
16605436638acc7c010349a69c3395f1a57c642dc62Ying Wang  res->number = nstates++;
16705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  res->accessing_symbol = s->accessing_symbol;
16805436638acc7c010349a69c3395f1a57c642dc62Ying Wang  res->transitions =
16905436638acc7c010349a69c3395f1a57c642dc62Ying Wang    transitions_new (s->transitions->num, s->transitions->states);
17005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  res->reductions = reductions_new (s->reductions->num, s->reductions->rules);
17105436638acc7c010349a69c3395f1a57c642dc62Ying Wang  res->errs = NULL;
17205436638acc7c010349a69c3395f1a57c642dc62Ying Wang  res->state_list = NULL;
17305436638acc7c010349a69c3395f1a57c642dc62Ying Wang  res->consistent = s->consistent;
17405436638acc7c010349a69c3395f1a57c642dc62Ying Wang  res->solved_conflicts = NULL;
17505436638acc7c010349a69c3395f1a57c642dc62Ying Wang  res->solved_conflicts_xml = NULL;
17605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
17705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  res->nitems = s->nitems;
17805436638acc7c010349a69c3395f1a57c642dc62Ying Wang  memcpy (res->items, s->items, items_size);
17905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
18005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  return res;
18105436638acc7c010349a69c3395f1a57c642dc62Ying Wang}
18205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
183cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
184cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*---------.
185cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Free S.  |
186cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`---------*/
187cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
188cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void
189cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstate_free (state *s)
190cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
191cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  free (s->transitions);
192cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  free (s->reductions);
193cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  free (s->errs);
194cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  free (s);
195cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
196cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
197cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
198cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*---------------------------.
199cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Set the transitions of S.  |
200cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`---------------------------*/
201cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
202cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid
203cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstate_transitions_set (state *s, int num, state **trans)
204cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
20505436638acc7c010349a69c3395f1a57c642dc62Ying Wang  aver (!s->transitions);
206cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  s->transitions = transitions_new (num, trans);
207cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
208cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
209cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
210cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*--------------------------.
211cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Set the reductions of S.  |
212cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`--------------------------*/
213cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
214cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid
215cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstate_reductions_set (state *s, int num, rule **reds)
216cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
21705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  aver (!s->reductions);
218cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  s->reductions = reductions_new (num, reds);
219cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
220cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
221cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
222cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint
223cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstate_reduction_find (state *s, rule *r)
224cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
225cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int i;
226cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  reductions *reds = s->reductions;
227cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (i = 0; i < reds->num; ++i)
228cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    if (reds->rules[i] == r)
229cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      return i;
230cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return -1;
231cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
232cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
233cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
234cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*--------------------.
235cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Set the errs of S.  |
236cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`--------------------*/
237cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
238cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid
239cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstate_errs_set (state *s, int num, symbol **tokens)
240cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
24105436638acc7c010349a69c3395f1a57c642dc62Ying Wang  aver (!s->errs);
242cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  s->errs = errs_new (num, tokens);
243cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
244cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
245cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
246cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
24705436638acc7c010349a69c3395f1a57c642dc62Ying Wang/*--------------------------------------------------.
24805436638acc7c010349a69c3395f1a57c642dc62Ying Wang| Print on OUT all the lookahead tokens such that S |
24905436638acc7c010349a69c3395f1a57c642dc62Ying Wang| wants to reduce R.                                |
25005436638acc7c010349a69c3395f1a57c642dc62Ying Wang`--------------------------------------------------*/
251cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
252cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid
25305436638acc7c010349a69c3395f1a57c642dc62Ying Wangstate_rule_lookahead_tokens_print (state *s, rule *r, FILE *out)
254cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
255cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Find the reduction we are handling.  */
256cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  reductions *reds = s->reductions;
257cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int red = state_reduction_find (s, r);
258cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
259cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Print them if there are.  */
26005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  if (reds->lookahead_tokens && red != -1)
261cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
262cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      bitset_iterator biter;
263cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      int k;
264cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      char const *sep = "";
265cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      fprintf (out, "  [");
26605436638acc7c010349a69c3395f1a57c642dc62Ying Wang      BITSET_FOR_EACH (biter, reds->lookahead_tokens[red], k, 0)
267cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	{
268cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  fprintf (out, "%s%s", sep, symbols[k]->tag);
269cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  sep = ", ";
270cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	}
271cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      fprintf (out, "]");
272cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
273cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
274cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
27505436638acc7c010349a69c3395f1a57c642dc62Ying Wangvoid
27605436638acc7c010349a69c3395f1a57c642dc62Ying Wangstate_rule_lookahead_tokens_print_xml (state *s, rule *r,
27705436638acc7c010349a69c3395f1a57c642dc62Ying Wang				       FILE *out, int level)
27805436638acc7c010349a69c3395f1a57c642dc62Ying Wang{
27905436638acc7c010349a69c3395f1a57c642dc62Ying Wang  /* Find the reduction we are handling.  */
28005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  reductions *reds = s->reductions;
28105436638acc7c010349a69c3395f1a57c642dc62Ying Wang  int red = state_reduction_find (s, r);
28205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
28305436638acc7c010349a69c3395f1a57c642dc62Ying Wang  /* Print them if there are.  */
28405436638acc7c010349a69c3395f1a57c642dc62Ying Wang  if (reds->lookahead_tokens && red != -1)
28505436638acc7c010349a69c3395f1a57c642dc62Ying Wang    {
28605436638acc7c010349a69c3395f1a57c642dc62Ying Wang      bitset_iterator biter;
28705436638acc7c010349a69c3395f1a57c642dc62Ying Wang      int k;
28805436638acc7c010349a69c3395f1a57c642dc62Ying Wang      xml_puts (out, level, "<lookaheads>");
28905436638acc7c010349a69c3395f1a57c642dc62Ying Wang      BITSET_FOR_EACH (biter, reds->lookahead_tokens[red], k, 0)
29005436638acc7c010349a69c3395f1a57c642dc62Ying Wang	{
29105436638acc7c010349a69c3395f1a57c642dc62Ying Wang	  xml_printf (out, level + 1, "<symbol>%s</symbol>",
29205436638acc7c010349a69c3395f1a57c642dc62Ying Wang		      xml_escape (symbols[k]->tag));
29305436638acc7c010349a69c3395f1a57c642dc62Ying Wang	}
29405436638acc7c010349a69c3395f1a57c642dc62Ying Wang      xml_puts (out, level, "</lookaheads>");
29505436638acc7c010349a69c3395f1a57c642dc62Ying Wang    }
29605436638acc7c010349a69c3395f1a57c642dc62Ying Wang}
29705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
298cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
299cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*---------------------.
300cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| A state hash table.  |
301cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`---------------------*/
302cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
303cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Initial capacity of states hash table.  */
304cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define HT_INITIAL_CAPACITY 257
305cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
306cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic struct hash_table *state_table = NULL;
307cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
308cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Two states are equal if they have the same core items.  */
309cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic inline bool
310cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstate_compare (state const *s1, state const *s2)
311cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
312cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  size_t i;
313cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
314cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (s1->nitems != s2->nitems)
315cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    return false;
316cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
317cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (i = 0; i < s1->nitems; ++i)
318cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    if (s1->items[i] != s2->items[i])
319cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      return false;
320cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
321cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return true;
322cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
323cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
324cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic bool
325cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstate_comparator (void const *s1, void const *s2)
326cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
327cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return state_compare (s1, s2);
328cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
329cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
330cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic inline size_t
331cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstate_hash (state const *s, size_t tablesize)
332cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
333cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Add up the state's item numbers to get a hash key.  */
334cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  size_t key = 0;
335cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  size_t i;
336cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (i = 0; i < s->nitems; ++i)
337cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    key += s->items[i];
338cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return key % tablesize;
339cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
340cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
341cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic size_t
342cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstate_hasher (void const *s, size_t tablesize)
343cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
344cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return state_hash (s, tablesize);
345cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
346cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
347cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
348cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*-------------------------------.
349cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Create the states hash table.  |
350cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`-------------------------------*/
351cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
352cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid
353cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstate_hash_new (void)
354cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
355cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  state_table = hash_initialize (HT_INITIAL_CAPACITY,
356cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project				 NULL,
357cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project				 state_hasher,
358cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project				 state_comparator,
359cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project				 NULL);
360cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
361cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
362cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
363cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*---------------------------------------------.
364cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Free the states hash table, not the states.  |
365cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`---------------------------------------------*/
366cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
367cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid
368cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstate_hash_free (void)
369cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
370cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  hash_free (state_table);
371cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
372cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
373cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
374cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*-----------------------------------.
375cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Insert S in the state hash table.  |
376cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`-----------------------------------*/
377cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
378cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid
379cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstate_hash_insert (state *s)
380cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
38105436638acc7c010349a69c3395f1a57c642dc62Ying Wang  if (!hash_insert (state_table, s))
38205436638acc7c010349a69c3395f1a57c642dc62Ying Wang    xalloc_die ();
383cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
384cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
385cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
386cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*------------------------------------------------------------------.
387cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Find the state associated to the CORE, and return it.  If it does |
388cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| not exist yet, return NULL.                                       |
389cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`------------------------------------------------------------------*/
390cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
391cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstate *
392cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstate_hash_lookup (size_t nitems, item_number *core)
393cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
394cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  size_t items_size = nitems * sizeof *core;
395cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  state *probe = xmalloc (offsetof (state, items) + items_size);
396cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  state *entry;
397cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
398cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  probe->nitems = nitems;
399cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  memcpy (probe->items, core, items_size);
400cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  entry = hash_lookup (state_table, probe);
401cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  free (probe);
402cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return entry;
403cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
404cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
40505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
40605436638acc7c010349a69c3395f1a57c642dc62Ying Wang/*--------------------------------------------------------.
40705436638acc7c010349a69c3395f1a57c642dc62Ying Wang| Record S and all states reachable from S in REACHABLE.  |
40805436638acc7c010349a69c3395f1a57c642dc62Ying Wang`--------------------------------------------------------*/
40905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
41005436638acc7c010349a69c3395f1a57c642dc62Ying Wangstatic void
41105436638acc7c010349a69c3395f1a57c642dc62Ying Wangstate_record_reachable_states (state *s, bitset reachable)
41205436638acc7c010349a69c3395f1a57c642dc62Ying Wang{
41305436638acc7c010349a69c3395f1a57c642dc62Ying Wang  if (bitset_test (reachable, s->number))
41405436638acc7c010349a69c3395f1a57c642dc62Ying Wang    return;
41505436638acc7c010349a69c3395f1a57c642dc62Ying Wang  bitset_set (reachable, s->number);
41605436638acc7c010349a69c3395f1a57c642dc62Ying Wang  {
41705436638acc7c010349a69c3395f1a57c642dc62Ying Wang    int i;
41805436638acc7c010349a69c3395f1a57c642dc62Ying Wang    for (i = 0; i < s->transitions->num; ++i)
41905436638acc7c010349a69c3395f1a57c642dc62Ying Wang      if (!TRANSITION_IS_DISABLED (s->transitions, i))
42005436638acc7c010349a69c3395f1a57c642dc62Ying Wang        state_record_reachable_states (s->transitions->states[i], reachable);
42105436638acc7c010349a69c3395f1a57c642dc62Ying Wang  }
42205436638acc7c010349a69c3395f1a57c642dc62Ying Wang}
42305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
42405436638acc7c010349a69c3395f1a57c642dc62Ying Wangvoid
42505436638acc7c010349a69c3395f1a57c642dc62Ying Wangstate_remove_unreachable_states (state_number old_to_new[])
42605436638acc7c010349a69c3395f1a57c642dc62Ying Wang{
42705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  state_number nstates_reachable = 0;
42805436638acc7c010349a69c3395f1a57c642dc62Ying Wang  bitset reachable = bitset_create (nstates, BITSET_FIXED);
42905436638acc7c010349a69c3395f1a57c642dc62Ying Wang  state_record_reachable_states (states[0], reachable);
43005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  {
43105436638acc7c010349a69c3395f1a57c642dc62Ying Wang    state_number i;
43205436638acc7c010349a69c3395f1a57c642dc62Ying Wang    for (i = 0; i < nstates; ++i)
43305436638acc7c010349a69c3395f1a57c642dc62Ying Wang      {
43405436638acc7c010349a69c3395f1a57c642dc62Ying Wang        if (bitset_test (reachable, states[i]->number))
43505436638acc7c010349a69c3395f1a57c642dc62Ying Wang          {
43605436638acc7c010349a69c3395f1a57c642dc62Ying Wang            states[nstates_reachable] = states[i];
43705436638acc7c010349a69c3395f1a57c642dc62Ying Wang            states[nstates_reachable]->number = nstates_reachable;
43805436638acc7c010349a69c3395f1a57c642dc62Ying Wang            old_to_new[i] = nstates_reachable++;
43905436638acc7c010349a69c3395f1a57c642dc62Ying Wang          }
44005436638acc7c010349a69c3395f1a57c642dc62Ying Wang        else
44105436638acc7c010349a69c3395f1a57c642dc62Ying Wang          {
44205436638acc7c010349a69c3395f1a57c642dc62Ying Wang            state_free (states[i]);
44305436638acc7c010349a69c3395f1a57c642dc62Ying Wang            old_to_new[i] = nstates;
44405436638acc7c010349a69c3395f1a57c642dc62Ying Wang          }
44505436638acc7c010349a69c3395f1a57c642dc62Ying Wang      }
44605436638acc7c010349a69c3395f1a57c642dc62Ying Wang  }
44705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  nstates = nstates_reachable;
44805436638acc7c010349a69c3395f1a57c642dc62Ying Wang  bitset_free (reachable);
44905436638acc7c010349a69c3395f1a57c642dc62Ying Wang}
45005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
451cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* All the decorated states, indexed by the state number.  */
452cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstate **states = NULL;
453cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
454cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
455cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*----------------------.
456cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Free all the states.  |
457cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`----------------------*/
458cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
459cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid
460cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstates_free (void)
461cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
462cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  state_number i;
463cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (i = 0; i < nstates; ++i)
464cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    state_free (states[i]);
465cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  free (states);
466cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
467