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