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