1cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Output the generated parsing program for Bison.
2cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   Copyright (C) 1984, 1986, 1989, 1992, 2000, 2001, 2002, 2003, 2004,
4cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   2005 Free 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 <bitsetv.h>
27cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <quotearg.h>
28cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
29cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "complain.h"
30cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "conflicts.h"
31cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "files.h"
32cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "getargs.h"
33cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "gram.h"
34cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "lalr.h"
35cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "reader.h"
36cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "symtab.h"
37cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "tables.h"
38cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
39cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Several tables are indexed both by state and nonterminal numbers.
40cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   We call such an index a `vector'; i.e., a vector is either a state
41cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   or a nonterminal number.
42cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
43cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   Of course vector_number_t ought to be wide enough to contain
44cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   state_number and symbol_number.  */
45cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttypedef int vector_number;
46cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
47cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#if 0 /* Not currently used.  */
48cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic inline vector_number
49cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstate_number_to_vector_number (state_number s)
50cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
51cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return s;
52cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
53cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
54cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
55cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic inline vector_number
56cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsymbol_number_to_vector_number (symbol_number sym)
57cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
58cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return state_number_as_int (nstates) + sym - ntokens;
59cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
60cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
61cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint nvectors;
62cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
63cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
64cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* FROMS and TOS are indexed by vector_number.
65cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
66cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   If VECTOR is a nonterminal, (FROMS[VECTOR], TOS[VECTOR]) form an
67cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   array of state numbers of the non defaulted GOTO on VECTOR.
68cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
69cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   If VECTOR is a state, TOS[VECTOR] is the array of actions to do on
70cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   the (array of) symbols FROMS[VECTOR].
71cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
72cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   In both cases, TALLY[VECTOR] is the size of the arrays
73cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   FROMS[VECTOR], TOS[VECTOR]; and WIDTH[VECTOR] =
74cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   (FROMS[VECTOR][SIZE] - FROMS[VECTOR][0] + 1) where SIZE =
75cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   TALLY[VECTOR].
76cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
77cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   FROMS therefore contains symbol_number and action_number,
78cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   TOS state_number and action_number,
79cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   TALLY sizes,
80cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   WIDTH differences of FROMS.
81cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
82cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   Let base_number be the type of FROMS, TOS, and WIDTH.  */
83cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define BASE_MAXIMUM INT_MAX
84cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define BASE_MINIMUM INT_MIN
85cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
86cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic base_number **froms;
87cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic base_number **tos;
88cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic unsigned int **conflict_tos;
89cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic int *tally;
90cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic base_number *width;
91cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
92cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
93cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* For a given state, N = ACTROW[SYMBOL]:
94cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
95cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   If N = 0, stands for `run the default action'.
96cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   If N = MIN, stands for `raise a syntax error'.
97cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   If N > 0, stands for `shift SYMBOL and go to n'.
98cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   If N < 0, stands for `reduce -N'.  */
99cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttypedef int action_number;
100cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define ACTION_NUMBER_MINIMUM INT_MIN
101cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
102cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic action_number *actrow;
103cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
104cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* FROMS and TOS are reordered to be compressed.  ORDER[VECTOR] is the
105cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   new vector number of VECTOR.  We skip `empty' vectors (i.e.,
106cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   TALLY[VECTOR] = 0), and call these `entries'.  */
107cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic vector_number *order;
108cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic int nentries;
109cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
110cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbase_number *base = NULL;
111cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* A distinguished value of BASE, negative infinite.  During the
112cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   computation equals to BASE_MINIMUM, later mapped to BASE_NINF to
113cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   keep parser tables small.  */
114cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbase_number base_ninf = 0;
115cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic base_number *pos = NULL;
116cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
117cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic unsigned int *conflrow;
118cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectunsigned int *conflict_table;
119cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectunsigned int *conflict_list;
120cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint conflict_list_cnt;
121cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic int conflict_list_free;
122cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
123cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* TABLE_SIZE is the allocated size of both TABLE and CHECK.  We start
124cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   with more or less the original hard-coded value (which was
125cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   SHRT_MAX).  */
126cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic int table_size = 32768;
127cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbase_number *table;
128cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbase_number *check;
129cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* The value used in TABLE to denote explicit syntax errors
130cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   (%nonassoc), a negative infinite.  First defaults to ACTION_NUMBER_MININUM,
131cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   but in order to keep small tables, renumbered as TABLE_ERROR, which
132cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   is the smallest (non error) value minus 1.  */
133cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbase_number table_ninf = 0;
134cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic int lowzero;
135cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint high;
136cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
137cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstate_number *yydefgoto;
138cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrule_number *yydefact;
139cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
140cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*----------------------------------------------------------------.
141cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| If TABLE (and CHECK) appear to be small to be addressed at      |
142cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| DESIRED, grow them.  Note that TABLE[DESIRED] is to be used, so |
143cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| the desired size is at least DESIRED + 1.                       |
144cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`----------------------------------------------------------------*/
145cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
146cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void
147cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttable_grow (int desired)
148cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
149cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int old_size = table_size;
150cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
151cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  while (table_size <= desired)
152cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    table_size *= 2;
153cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
154cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (trace_flag & trace_resource)
155cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    fprintf (stderr, "growing table and check from: %d to %d\n",
156cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	     old_size, table_size);
157cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
158cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  table = xnrealloc (table, table_size, sizeof *table);
159cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  conflict_table = xnrealloc (conflict_table, table_size,
160cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project			      sizeof *conflict_table);
161cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  check = xnrealloc (check, table_size, sizeof *check);
162cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
163cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (/* Nothing. */; old_size < table_size; ++old_size)
164cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
165cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      table[old_size] = 0;
166cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      conflict_table[old_size] = 0;
167cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      check[old_size] = -1;
168cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
169cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
170cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
171cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
172cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
173cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
174cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*-------------------------------------------------------------------.
175cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| For GLR parsers, for each conflicted token in S, as indicated      |
176cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| by non-zero entries in CONFLROW, create a list of possible	     |
177cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| reductions that are alternatives to the shift or reduction	     |
178cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| currently recorded for that token in S.  Store the alternative     |
179cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| reductions followed by a 0 in CONFLICT_LIST, updating		     |
180cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| CONFLICT_LIST_CNT, and storing an index to the start of the list   |
181cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| back into CONFLROW.						     |
182cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`-------------------------------------------------------------------*/
183cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
184cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void
185cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectconflict_row (state *s)
186cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
187cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int i, j;
188cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  reductions *reds = s->reductions;
189cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
190cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (!nondeterministic_parser)
191cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    return;
192cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
193cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (j = 0; j < ntokens; j += 1)
194cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    if (conflrow[j])
195cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      {
196cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	conflrow[j] = conflict_list_cnt;
197cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
198cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	/* Find all reductions for token J, and record all that do not
199cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	   match ACTROW[J].  */
200cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	for (i = 0; i < reds->num; i += 1)
201cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  if (bitset_test (reds->look_ahead_tokens[i], j)
202cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	      && (actrow[j]
203cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project		  != rule_number_as_item_number (reds->rules[i]->number)))
204cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	    {
205cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	      assert (0 < conflict_list_free);
206cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	      conflict_list[conflict_list_cnt] = reds->rules[i]->number + 1;
207cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	      conflict_list_cnt += 1;
208cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	      conflict_list_free -= 1;
209cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	    }
210cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
211cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	/* Leave a 0 at the end.  */
212cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	assert (0 < conflict_list_free);
213cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	conflict_list[conflict_list_cnt] = 0;
214cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	conflict_list_cnt += 1;
215cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	conflict_list_free -= 1;
216cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      }
217cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
218cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
219cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
220cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*------------------------------------------------------------------.
221cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Decide what to do for each type of token if seen as the           |
222cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| look-ahead in specified state.  The value returned is used as the |
223cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| default action (yydefact) for the state.  In addition, ACTROW is  |
224cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| filled with what to do for each kind of token, index by symbol    |
225cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| number, with zero meaning do the default action.  The value       |
226cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| ACTION_NUMBER_MINIMUM, a very negative number, means this	    |
227cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| situation is an error.  The parser recognizes this value	    |
228cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| specially.							    |
229cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project|                                                                   |
230cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| This is where conflicts are resolved.  The loop over look-ahead   |
231cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| rules considered lower-numbered rules last, and the last rule     |
232cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| considered that likes a token gets to handle it.                  |
233cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project|                                                                   |
234cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| For GLR parsers, also sets CONFLROW[SYM] to an index into         |
235cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| CONFLICT_LIST iff there is an unresolved conflict (s/r or r/r)    |
236cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| with symbol SYM. The default reduction is not used for a symbol   |
237cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| that has any such conflicts.                                      |
238cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`------------------------------------------------------------------*/
239cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
240cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic rule *
241cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectaction_row (state *s)
242cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
243cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int i;
244cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  rule *default_rule = NULL;
245cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  reductions *reds = s->reductions;
246cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  transitions *trans = s->transitions;
247cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  errs *errp = s->errs;
248cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Set to nonzero to inhibit having any default reduction.  */
249cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bool nodefault = false;
250cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bool conflicted = false;
251cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
252cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (i = 0; i < ntokens; i++)
253cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    actrow[i] = conflrow[i] = 0;
254cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
255cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (reds->look_ahead_tokens)
256cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
257cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      int j;
258cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      bitset_iterator biter;
259cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      /* loop over all the rules available here which require
260cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	 look-ahead (in reverse order to give precedence to the first
261cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	 rule) */
262cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      for (i = reds->num - 1; i >= 0; --i)
263cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	/* and find each token which the rule finds acceptable
264cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	   to come next */
265cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	BITSET_FOR_EACH (biter, reds->look_ahead_tokens[i], j, 0)
266cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	{
267cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  /* and record this rule as the rule to use if that
268cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	     token follows.  */
269cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  if (actrow[j] != 0)
270cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	    {
271cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	      conflicted = true;
272cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	      conflrow[j] = 1;
273cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	    }
274cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  actrow[j] = rule_number_as_item_number (reds->rules[i]->number);
275cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	}
276cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
277cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
278cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Now see which tokens are allowed for shifts in this state.  For
279cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     them, record the shift as the thing to do.  So shift is preferred
280cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     to reduce.  */
281cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  FOR_EACH_SHIFT (trans, i)
282cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
283cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      symbol_number sym = TRANSITION_SYMBOL (trans, i);
284cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      state *shift_state = trans->states[i];
285cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
286cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      if (actrow[sym] != 0)
287cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	{
288cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  conflicted = true;
289cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  conflrow[sym] = 1;
290cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	}
291cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      actrow[sym] = state_number_as_int (shift_state->number);
292cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
293cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      /* Do not use any default reduction if there is a shift for
294cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	 error */
295cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      if (sym == errtoken->number)
296cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	nodefault = true;
297cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
298cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
299cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* See which tokens are an explicit error in this state (due to
300cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     %nonassoc).  For them, record ACTION_NUMBER_MINIMUM as the
301cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     action.  */
302cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (i = 0; i < errp->num; i++)
303cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
304cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      symbol *sym = errp->symbols[i];
305cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      actrow[sym->number] = ACTION_NUMBER_MINIMUM;
306cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
307cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
308cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Now find the most common reduction and make it the default action
309cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     for this state.  */
310cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
311cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (reds->num >= 1 && !nodefault)
312cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
313cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      if (s->consistent)
314cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	default_rule = reds->rules[0];
315cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      else
316cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	{
317cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  int max = 0;
318cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  for (i = 0; i < reds->num; i++)
319cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	    {
320cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	      int count = 0;
321cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	      rule *r = reds->rules[i];
322cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	      symbol_number j;
323cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
324cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	      for (j = 0; j < ntokens; j++)
325cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project		if (actrow[j] == rule_number_as_item_number (r->number))
326cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project		  count++;
327cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
328cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	      if (count > max)
329cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project		{
330cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project		  max = count;
331cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project		  default_rule = r;
332cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project		}
333cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	    }
334cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
335cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  /* GLR parsers need space for conflict lists, so we can't
336cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	     default conflicted entries.  For non-conflicted entries
337cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	     or as long as we are not building a GLR parser,
338cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	     actions that match the default are replaced with zero,
339cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	     which means "use the default". */
340cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
341cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  if (max > 0)
342cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	    {
343cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	      int j;
344cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	      for (j = 0; j < ntokens; j++)
345cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project		if (actrow[j] == rule_number_as_item_number (default_rule->number)
346cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project		    && ! (nondeterministic_parser && conflrow[j]))
347cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project		  actrow[j] = 0;
348cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	    }
349cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	}
350cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
351cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
352cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* If have no default rule, the default is an error.
353cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     So replace any action which says "error" with "use default".  */
354cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
355cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (!default_rule)
356cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    for (i = 0; i < ntokens; i++)
357cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      if (actrow[i] == ACTION_NUMBER_MINIMUM)
358cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	actrow[i] = 0;
359cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
360cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (conflicted)
361cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    conflict_row (s);
362cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
363cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return default_rule;
364cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
365cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
366cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
367cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*----------------------------------------.
368cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Set FROMS, TOS, TALLY and WIDTH for S.  |
369cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`----------------------------------------*/
370cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
371cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void
372cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsave_row (state_number s)
373cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
374cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  symbol_number i;
375cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int count;
376cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  base_number *sp;
377cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  base_number *sp1;
378cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  base_number *sp2;
379cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  unsigned int *sp3;
380cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
381cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Number of non default actions in S.  */
382cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  count = 0;
383cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (i = 0; i < ntokens; i++)
384cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    if (actrow[i] != 0)
385cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      count++;
386cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
387cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (count == 0)
388cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    return;
389cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
390cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Allocate non defaulted actions.  */
391cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  froms[s] = sp = sp1 = xnmalloc (count, sizeof *sp1);
392cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  tos[s] = sp2 = xnmalloc (count, sizeof *sp2);
393cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  conflict_tos[s] = sp3 =
394cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    nondeterministic_parser ? xnmalloc (count, sizeof *sp3) : NULL;
395cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
396cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Store non defaulted actions.  */
397cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (i = 0; i < ntokens; i++)
398cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    if (actrow[i] != 0)
399cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      {
400cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	*sp1++ = i;
401cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	*sp2++ = actrow[i];
402cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	if (nondeterministic_parser)
403cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  *sp3++ = conflrow[i];
404cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      }
405cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
406cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  tally[s] = count;
407cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  width[s] = sp1[-1] - sp[0] + 1;
408cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
409cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
410cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
411cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*------------------------------------------------------------------.
412cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Figure out the actions for the specified state, indexed by        |
413cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| look-ahead token type.                                            |
414cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project|                                                                   |
415cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| The YYDEFACT table is output now.  The detailed info is saved for |
416cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| putting into YYTABLE later.                                       |
417cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`------------------------------------------------------------------*/
418cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
419cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void
420cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttoken_actions (void)
421cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
422cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  state_number i;
423cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  symbol_number j;
424cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  rule_number r;
425cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
426cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int nconflict = nondeterministic_parser ? conflicts_total_count () : 0;
427cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
428cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  yydefact = xnmalloc (nstates, sizeof *yydefact);
429cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
430cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  actrow = xnmalloc (ntokens, sizeof *actrow);
431cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  conflrow = xnmalloc (ntokens, sizeof *conflrow);
432cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
433cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  conflict_list = xnmalloc (1 + 2 * nconflict, sizeof *conflict_list);
434cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  conflict_list_free = 2 * nconflict;
435cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  conflict_list_cnt = 1;
436cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
437cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Find the rules which are reduced.  */
438cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (!nondeterministic_parser)
439cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    for (r = 0; r < nrules; ++r)
440cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      rules[r].useful = false;
441cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
442cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (i = 0; i < nstates; ++i)
443cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
444cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      rule *default_rule = action_row (states[i]);
445cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      yydefact[i] = default_rule ? default_rule->number + 1 : 0;
446cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      save_row (i);
447cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
448cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      /* Now that the parser was computed, we can find which rules are
449cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	 really reduced, and which are not because of SR or RR
450cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	 conflicts.  */
451cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      if (!nondeterministic_parser)
452cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	{
453cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  for (j = 0; j < ntokens; ++j)
454cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	    if (actrow[j] < 0 && actrow[j] != ACTION_NUMBER_MINIMUM)
455cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	      rules[item_number_as_rule_number (actrow[j])].useful = true;
456cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  if (yydefact[i])
457cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	    rules[yydefact[i] - 1].useful = true;
458cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	}
459cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
460cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
461cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  free (actrow);
462cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  free (conflrow);
463cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
464cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
465cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
466cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*------------------------------------------------------------------.
467cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Compute FROMS[VECTOR], TOS[VECTOR], TALLY[VECTOR], WIDTH[VECTOR], |
468cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| i.e., the information related to non defaulted GOTO on the nterm  |
469cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| SYM.                                                              |
470cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project|                                                                   |
471cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| DEFAULT_STATE is the principal destination on SYM, i.e., the      |
472cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| default GOTO destination on SYM.                                  |
473cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`------------------------------------------------------------------*/
474cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
475cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void
476cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsave_column (symbol_number sym, state_number default_state)
477cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
478cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  goto_number i;
479cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  base_number *sp;
480cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  base_number *sp1;
481cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  base_number *sp2;
482cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int count;
483cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  vector_number symno = symbol_number_to_vector_number (sym);
484cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
485cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  goto_number begin = goto_map[sym - ntokens];
486cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  goto_number end = goto_map[sym - ntokens + 1];
487cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
488cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Number of non default GOTO.  */
489cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  count = 0;
490cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (i = begin; i < end; i++)
491cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    if (to_state[i] != default_state)
492cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      count++;
493cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
494cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (count == 0)
495cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    return;
496cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
497cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Allocate room for non defaulted gotos.  */
498cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  froms[symno] = sp = sp1 = xnmalloc (count, sizeof *sp1);
499cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  tos[symno] = sp2 = xnmalloc (count, sizeof *sp2);
500cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
501cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Store the state numbers of the non defaulted gotos.  */
502cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (i = begin; i < end; i++)
503cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    if (to_state[i] != default_state)
504cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      {
505cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	*sp1++ = from_state[i];
506cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	*sp2++ = to_state[i];
507cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      }
508cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
509cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  tally[symno] = count;
510cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  width[symno] = sp1[-1] - sp[0] + 1;
511cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
512cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
513cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
514cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*-------------------------------------------------------------.
515cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Return `the' most common destination GOTO on SYM (a nterm).  |
516cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`-------------------------------------------------------------*/
517cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
518cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic state_number
519cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdefault_goto (symbol_number sym, size_t state_count[])
520cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
521cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  state_number s;
522cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  goto_number i;
523cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  goto_number m = goto_map[sym - ntokens];
524cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  goto_number n = goto_map[sym - ntokens + 1];
525cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  state_number default_state = -1;
526cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  size_t max = 0;
527cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
528cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (m == n)
529cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    return -1;
530cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
531cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (s = 0; s < nstates; s++)
532cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    state_count[s] = 0;
533cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
534cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (i = m; i < n; i++)
535cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    state_count[to_state[i]]++;
536cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
537cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (s = 0; s < nstates; s++)
538cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    if (state_count[s] > max)
539cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      {
540cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	max = state_count[s];
541cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	default_state = s;
542cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      }
543cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
544cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return default_state;
545cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
546cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
547cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
548cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*-------------------------------------------------------------------.
549cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Figure out what to do after reducing with each rule, depending on  |
550cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| the saved state from before the beginning of parsing the data that |
551cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| matched this rule.                                                 |
552cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project|                                                                    |
553cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| The YYDEFGOTO table is output now.  The detailed info is saved for |
554cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| putting into YYTABLE later.                                        |
555cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`-------------------------------------------------------------------*/
556cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
557cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void
558cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectgoto_actions (void)
559cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
560cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  symbol_number i;
561cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  size_t *state_count = xnmalloc (nstates, sizeof *state_count);
562cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  yydefgoto = xnmalloc (nvars, sizeof *yydefgoto);
563cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
564cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* For a given nterm I, STATE_COUNT[S] is the number of times there
565cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     is a GOTO to S on I.  */
566cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (i = ntokens; i < nsyms; ++i)
567cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
568cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      state_number default_state = default_goto (i, state_count);
569cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      save_column (i, default_state);
570cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      yydefgoto[i - ntokens] = default_state;
571cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
572cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  free (state_count);
573cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
574cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
575cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
576cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*------------------------------------------------------------------.
577cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Compute ORDER, a reordering of vectors, in order to decide how to |
578cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| pack the actions and gotos information into yytable.              |
579cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`------------------------------------------------------------------*/
580cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
581cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void
582cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsort_actions (void)
583cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
584cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int i;
585cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
586cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  nentries = 0;
587cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
588cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (i = 0; i < nvectors; i++)
589cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    if (tally[i] > 0)
590cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      {
591cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	int k;
592cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	int t = tally[i];
593cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	int w = width[i];
594cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	int j = nentries - 1;
595cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
596cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	while (j >= 0 && (width[order[j]] < w))
597cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  j--;
598cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
599cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	while (j >= 0 && (width[order[j]] == w) && (tally[order[j]] < t))
600cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  j--;
601cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
602cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	for (k = nentries - 1; k > j; k--)
603cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  order[k + 1] = order[k];
604cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
605cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	order[j + 1] = i;
606cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	nentries++;
607cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      }
608cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
609cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
610cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
611cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* If VECTOR is a state which actions (reflected by FROMS, TOS, TALLY
612cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   and WIDTH of VECTOR) are common to a previous state, return this
613cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   state number.
614cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
615cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   In any other case, return -1.  */
616cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
617cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic state_number
618cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmatching_state (vector_number vector)
619cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
620cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  vector_number i = order[vector];
621cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int t;
622cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int w;
623cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int prev;
624cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
625cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* If VECTOR is a nterm, return -1.  */
626cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (nstates <= i)
627cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    return -1;
628cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
629cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  t = tally[i];
630cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  w = width[i];
631cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
632cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* If VECTOR has GLR conflicts, return -1 */
633cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (conflict_tos[i] != NULL)
634cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
635cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      int j;
636cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      for (j = 0; j < t; j += 1)
637cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	if (conflict_tos[i][j] != 0)
638cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  return -1;
639cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
640cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
641cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (prev = vector - 1; prev >= 0; prev--)
642cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
643cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      vector_number j = order[prev];
644cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      int k;
645cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      int match = 1;
646cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
647cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      /* Given how ORDER was computed, if the WIDTH or TALLY is
648cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	 different, there cannot be a matching state.  */
649cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      if (width[j] != w || tally[j] != t)
650cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	return -1;
651cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
652cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      for (k = 0; match && k < t; k++)
653cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	if (tos[j][k] != tos[i][k] || froms[j][k] != froms[i][k]
654cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	    || (conflict_tos[j] != NULL && conflict_tos[j][k] != 0))
655cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  match = 0;
656cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
657cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      if (match)
658cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	return j;
659cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
660cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
661cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return -1;
662cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
663cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
664cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
665cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic base_number
666cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectpack_vector (vector_number vector)
667cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
668cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  vector_number i = order[vector];
669cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int j;
670cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int t = tally[i];
671cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int loc = 0;
672cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  base_number *from = froms[i];
673cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  base_number *to = tos[i];
674cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  unsigned int *conflict_to = conflict_tos[i];
675cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
676cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  assert (t);
677cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
678cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (j = lowzero - from[0]; ; j++)
679cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
680cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      int k;
681cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      bool ok = true;
682cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
683cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      assert (j < table_size);
684cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
685cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      for (k = 0; ok && k < t; k++)
686cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	{
687cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  loc = j + state_number_as_int (from[k]);
688cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  if (table_size <= loc)
689cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	    table_grow (loc);
690cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
691cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  if (table[loc] != 0)
692cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	    ok = false;
693cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	}
694cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
695cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      for (k = 0; ok && k < vector; k++)
696cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	if (pos[k] == j)
697cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  ok = false;
698cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
699cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      if (ok)
700cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	{
701cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  for (k = 0; k < t; k++)
702cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	    {
703cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	      loc = j + from[k];
704cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	      table[loc] = to[k];
705cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	      if (nondeterministic_parser && conflict_to != NULL)
706cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project		conflict_table[loc] = conflict_to[k];
707cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	      check[loc] = from[k];
708cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	    }
709cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
710cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  while (table[lowzero] != 0)
711cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	    lowzero++;
712cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
713cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  if (loc > high)
714cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	    high = loc;
715cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
716cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  assert (BASE_MINIMUM <= j && j <= BASE_MAXIMUM);
717cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  return j;
718cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	}
719cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
720cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
721cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
722cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
723cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*-------------------------------------------------------------.
724cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Remap the negative infinite in TAB from NINF to the greatest |
725cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| possible smallest value.  Return it.                         |
726cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project|                                                              |
727cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| In most case this allows us to use shorts instead of ints in |
728cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| parsers.                                                     |
729cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`-------------------------------------------------------------*/
730cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
731cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic base_number
732cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttable_ninf_remap (base_number tab[], int size, base_number ninf)
733cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
734cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  base_number res = 0;
735cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int i;
736cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
737cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (i = 0; i < size; i++)
738cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    if (tab[i] < res && tab[i] != ninf)
739cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      res = tab[i];
740cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
741cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  --res;
742cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
743cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (i = 0; i < size; i++)
744cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    if (tab[i] == ninf)
745cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      tab[i] = res;
746cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
747cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return res;
748cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
749cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
750cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void
751cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectpack_table (void)
752cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
753cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int i;
754cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
755cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  base = xnmalloc (nvectors, sizeof *base);
756cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  pos = xnmalloc (nentries, sizeof *pos);
757cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  table = xcalloc (table_size, sizeof *table);
758cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  conflict_table = xcalloc (table_size, sizeof *conflict_table);
759cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  check = xnmalloc (table_size, sizeof *check);
760cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
761cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  lowzero = 0;
762cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  high = 0;
763cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
764cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (i = 0; i < nvectors; i++)
765cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    base[i] = BASE_MINIMUM;
766cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
767cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (i = 0; i < table_size; i++)
768cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    check[i] = -1;
769cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
770cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (i = 0; i < nentries; i++)
771cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
772cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      state_number s = matching_state (i);
773cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      base_number place;
774cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
775cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      if (s < 0)
776cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	/* A new set of state actions, or a nonterminal.  */
777cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	place = pack_vector (i);
778cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      else
779cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	/* Action of I were already coded for S.  */
780cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	place = base[s];
781cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
782cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      pos[i] = place;
783cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      base[order[i]] = place;
784cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
785cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
786cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Use the greatest possible negative infinites.  */
787cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  base_ninf = table_ninf_remap (base, nvectors, BASE_MINIMUM);
788cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  table_ninf = table_ninf_remap (table, high + 1, ACTION_NUMBER_MINIMUM);
789cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
790cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  free (pos);
791cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
792cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
793cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
794cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
795cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*-----------------------------------------------------------------.
796cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Compute and output yydefact, yydefgoto, yypact, yypgoto, yytable |
797cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| and yycheck.                                                     |
798cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`-----------------------------------------------------------------*/
799cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
800cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid
801cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttables_generate (void)
802cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
803cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int i;
804cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
805cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* This is a poor way to make sure the sizes are properly
806cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     correlated.  In particular the signedness is not taken into
807cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     account.  But it's not useless.  */
808cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  verify (sizeof nstates <= sizeof nvectors
809cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  && sizeof nvars <= sizeof nvectors);
810cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
811cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  nvectors = state_number_as_int (nstates) + nvars;
812cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
813cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  froms = xcalloc (nvectors, sizeof *froms);
814cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  tos = xcalloc (nvectors, sizeof *tos);
815cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  conflict_tos = xcalloc (nvectors, sizeof *conflict_tos);
816cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  tally = xcalloc (nvectors, sizeof *tally);
817cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  width = xnmalloc (nvectors, sizeof *width);
818cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
819cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  token_actions ();
820cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
821cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  goto_actions ();
822cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  free (goto_map);
823cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  free (from_state);
824cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  free (to_state);
825cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
826cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  order = xcalloc (nvectors, sizeof *order);
827cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  sort_actions ();
828cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  pack_table ();
829cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  free (order);
830cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
831cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  free (tally);
832cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  free (width);
833cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
834cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (i = 0; i < nvectors; i++)
835cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
836cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      free (froms[i]);
837cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      free (tos[i]);
838cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      free (conflict_tos[i]);
839cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
840cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
841cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  free (froms);
842cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  free (tos);
843cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  free (conflict_tos);
844cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
845cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
846cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
847cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*-------------------------.
848cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Free the parser tables.  |
849cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`-------------------------*/
850cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
851cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid
852cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttables_free (void)
853cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
854cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  free (base);
855cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  free (conflict_table);
856cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  free (conflict_list);
857cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  free (table);
858cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  free (check);
859cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  free (yydefgoto);
860cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  free (yydefact);
861cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
862