output.c revision cea198a11f15a2eb071d98491ca9a8bc8cebfbc4
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, 2006 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 <error.h> 27cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <get-errno.h> 28cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <quotearg.h> 29cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <subpipe.h> 30cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <timevar.h> 31cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 32cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "complain.h" 33cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "files.h" 34cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "getargs.h" 35cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "gram.h" 36cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "muscle_tab.h" 37cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "output.h" 38cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "reader.h" 39cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "scan-skel.h" 40cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "symtab.h" 41cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "tables.h" 42cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 43cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 44cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic struct obstack format_obstack; 45cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 46cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 47cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*-------------------------------------------------------------------. 48cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Create a function NAME which associates to the muscle NAME the | 49cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| result of formatting the FIRST and then TABLE_DATA[BEGIN..END[ (of | 50cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| TYPE), and to the muscle NAME_max, the max value of the | 51cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| TABLE_DATA. | 52cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`-------------------------------------------------------------------*/ 53cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 54cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 55cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define GENERATE_MUSCLE_INSERT_TABLE(Name, Type) \ 56cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project \ 57cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void \ 58cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectName (char const *name, \ 59cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project Type *table_data, \ 60cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project Type first, \ 61cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int begin, \ 62cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int end) \ 63cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ \ 64cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project Type min = first; \ 65cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project Type max = first; \ 66cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project long int lmin; \ 67cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project long int lmax; \ 68cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int i; \ 69cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int j = 1; \ 70cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project \ 71cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project obstack_fgrow1 (&format_obstack, "%6d", first); \ 72cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (i = begin; i < end; ++i) \ 73cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { \ 74cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project obstack_1grow (&format_obstack, ','); \ 75cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (j >= 10) \ 76cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { \ 77cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project obstack_sgrow (&format_obstack, "\n "); \ 78cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project j = 1; \ 79cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } \ 80cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project else \ 81cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project ++j; \ 82cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project obstack_fgrow1 (&format_obstack, "%6d", table_data[i]); \ 83cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (table_data[i] < min) \ 84cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project min = table_data[i]; \ 85cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (max < table_data[i]) \ 86cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project max = table_data[i]; \ 87cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } \ 88cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project obstack_1grow (&format_obstack, 0); \ 89cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project muscle_insert (name, obstack_finish (&format_obstack)); \ 90cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project \ 91cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project lmin = min; \ 92cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project lmax = max; \ 93cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Build `NAME_min' and `NAME_max' in the obstack. */ \ 94cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project obstack_fgrow1 (&format_obstack, "%s_min", name); \ 95cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project obstack_1grow (&format_obstack, 0); \ 96cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project MUSCLE_INSERT_LONG_INT (obstack_finish (&format_obstack), lmin); \ 97cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project obstack_fgrow1 (&format_obstack, "%s_max", name); \ 98cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project obstack_1grow (&format_obstack, 0); \ 99cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project MUSCLE_INSERT_LONG_INT (obstack_finish (&format_obstack), lmax); \ 100cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 101cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 102cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectGENERATE_MUSCLE_INSERT_TABLE(muscle_insert_unsigned_int_table, unsigned int) 103cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectGENERATE_MUSCLE_INSERT_TABLE(muscle_insert_int_table, int) 104cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectGENERATE_MUSCLE_INSERT_TABLE(muscle_insert_base_table, base_number) 105cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectGENERATE_MUSCLE_INSERT_TABLE(muscle_insert_rule_number_table, rule_number) 106cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectGENERATE_MUSCLE_INSERT_TABLE(muscle_insert_symbol_number_table, symbol_number) 107cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectGENERATE_MUSCLE_INSERT_TABLE(muscle_insert_item_number_table, item_number) 108cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectGENERATE_MUSCLE_INSERT_TABLE(muscle_insert_state_number_table, state_number) 109cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 110cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 111cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*--------------------------------------------------------------------. 112cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Print to OUT a representation of STRING escaped both for C and M4. | 113cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`--------------------------------------------------------------------*/ 114cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 115cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void 116cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectescaped_output (FILE *out, char const *string) 117cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 118cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project char const *p; 119cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (out, "[["); 120cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 121cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (p = quotearg_style (c_quoting_style, string); *p; p++) 122cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project switch (*p) 123cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 124cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project case '$': fputs ("$][", out); break; 125cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project case '@': fputs ("@@", out); break; 126cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project case '[': fputs ("@{", out); break; 127cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project case ']': fputs ("@}", out); break; 128cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project default: fputc (*p, out); break; 129cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 130cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 131cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (out, "]]"); 132cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 133cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 134cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 135cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*------------------------------------------------------------------. 136cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Prepare the muscles related to the symbols: translate, tname, and | 137cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| toknum. | 138cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`------------------------------------------------------------------*/ 139cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 140cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void 141cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprepare_symbols (void) 142cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 143cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project MUSCLE_INSERT_BOOL ("token_table", token_table_flag); 144cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project MUSCLE_INSERT_INT ("tokens_number", ntokens); 145cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project MUSCLE_INSERT_INT ("nterms_number", nvars); 146cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project MUSCLE_INSERT_INT ("undef_token_number", undeftoken->number); 147cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project MUSCLE_INSERT_INT ("user_token_number_max", max_user_token_number); 148cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 149cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project muscle_insert_symbol_number_table ("translate", 150cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project token_translations, 151cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project token_translations[0], 152cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 1, max_user_token_number + 1); 153cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 154cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* tname -- token names. */ 155cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 156cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int i; 157cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* We assume that the table will be output starting at column 2. */ 158cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int j = 2; 159cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (i = 0; i < nsyms; i++) 160cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 161cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project char const *cp = quotearg_style (c_quoting_style, symbols[i]->tag); 162cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Width of the next token, including the two quotes, the 163cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project comma and the space. */ 164cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int width = strlen (cp) + 2; 165cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 166cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (j + width > 75) 167cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 168cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project obstack_sgrow (&format_obstack, "\n "); 169cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project j = 1; 170cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 171cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 172cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (i) 173cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project obstack_1grow (&format_obstack, ' '); 174cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project MUSCLE_OBSTACK_SGROW (&format_obstack, cp); 175cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project obstack_1grow (&format_obstack, ','); 176cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project j += width; 177cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 178cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Add a NULL entry to list of tokens (well, 0, as NULL might not be 179cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project defined). */ 180cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project obstack_sgrow (&format_obstack, " 0"); 181cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 182cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Finish table and store. */ 183cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project obstack_1grow (&format_obstack, 0); 184cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project muscle_insert ("tname", obstack_finish (&format_obstack)); 185cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 186cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 187cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Output YYTOKNUM. */ 188cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 189cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int i; 190cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int *values = xnmalloc (ntokens, sizeof *values); 191cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (i = 0; i < ntokens; ++i) 192cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project values[i] = symbols[i]->user_token_number; 193cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project muscle_insert_int_table ("toknum", values, 194cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project values[0], 1, ntokens); 195cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project free (values); 196cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 197cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 198cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 199cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 200cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*-------------------------------------------------------------. 201cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Prepare the muscles related to the rules: rhs, prhs, r1, r2, | 202cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| rline, dprec, merger. | 203cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`-------------------------------------------------------------*/ 204cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 205cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void 206cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprepare_rules (void) 207cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 208cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project rule_number r; 209cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project unsigned int i = 0; 210cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project item_number *rhs = xnmalloc (nritems, sizeof *rhs); 211cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project unsigned int *prhs = xnmalloc (nrules, sizeof *prhs); 212cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project unsigned int *rline = xnmalloc (nrules, sizeof *rline); 213cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project symbol_number *r1 = xnmalloc (nrules, sizeof *r1); 214cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project unsigned int *r2 = xnmalloc (nrules, sizeof *r2); 215cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int *dprec = xnmalloc (nrules, sizeof *dprec); 216cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int *merger = xnmalloc (nrules, sizeof *merger); 217cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 218cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (r = 0; r < nrules; ++r) 219cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 220cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project item_number *rhsp = NULL; 221cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Index of rule R in RHS. */ 222cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project prhs[r] = i; 223cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* RHS of the rule R. */ 224cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (rhsp = rules[r].rhs; *rhsp >= 0; ++rhsp) 225cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project rhs[i++] = *rhsp; 226cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* LHS of the rule R. */ 227cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project r1[r] = rules[r].lhs->number; 228cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Length of rule R's RHS. */ 229cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project r2[r] = i - prhs[r]; 230cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Separator in RHS. */ 231cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project rhs[i++] = -1; 232cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Line where rule was defined. */ 233cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project rline[r] = rules[r].location.start.line; 234cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Dynamic precedence (GLR). */ 235cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project dprec[r] = rules[r].dprec; 236cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Merger-function index (GLR). */ 237cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project merger[r] = rules[r].merger; 238cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 239cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project assert (i == nritems); 240cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 241cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project muscle_insert_item_number_table ("rhs", rhs, ritem[0], 1, nritems); 242cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project muscle_insert_unsigned_int_table ("prhs", prhs, 0, 0, nrules); 243cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project muscle_insert_unsigned_int_table ("rline", rline, 0, 0, nrules); 244cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project muscle_insert_symbol_number_table ("r1", r1, 0, 0, nrules); 245cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project muscle_insert_unsigned_int_table ("r2", r2, 0, 0, nrules); 246cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project muscle_insert_int_table ("dprec", dprec, 0, 0, nrules); 247cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project muscle_insert_int_table ("merger", merger, 0, 0, nrules); 248cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 249cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project MUSCLE_INSERT_INT ("rules_number", nrules); 250cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project MUSCLE_INSERT_INT ("max_left_semantic_context", max_left_semantic_context); 251cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 252cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project free (rhs); 253cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project free (prhs); 254cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project free (rline); 255cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project free (r1); 256cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project free (r2); 257cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project free (dprec); 258cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project free (merger); 259cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 260cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 261cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*--------------------------------------------. 262cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Prepare the muscles related to the states. | 263cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`--------------------------------------------*/ 264cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 265cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void 266cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprepare_states (void) 267cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 268cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project state_number i; 269cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project symbol_number *values = xnmalloc (nstates, sizeof *values); 270cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (i = 0; i < nstates; ++i) 271cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project values[i] = states[i]->accessing_symbol; 272cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project muscle_insert_symbol_number_table ("stos", values, 273cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 0, 1, nstates); 274cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project free (values); 275cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 276cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project MUSCLE_INSERT_INT ("last", high); 277cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project MUSCLE_INSERT_INT ("final_state_number", final_state->number); 278cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project MUSCLE_INSERT_INT ("states_number", nstates); 279cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 280cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 281cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 282cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 283cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*---------------------------------. 284cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Output the user actions to OUT. | 285cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`---------------------------------*/ 286cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 287cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void 288cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectuser_actions_output (FILE *out) 289cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 290cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project rule_number r; 291cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 292cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fputs ("m4_define([b4_actions], \n[[", out); 293cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (r = 0; r < nrules; ++r) 294cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (rules[r].action) 295cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 296cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (out, " case %d:\n", r + 1); 297cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 298cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (out, "]b4_syncline(%d, ", 299cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project rules[r].action_location.start.line); 300cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project escaped_output (out, rules[r].action_location.start.file); 301cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (out, ")[\n"); 302cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (out, " %s\n break;\n\n", 303cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project rules[r].action); 304cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 305cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fputs ("]])\n\n", out); 306cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 307cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 308cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*--------------------------------------. 309cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Output the merge functions to OUT. | 310cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`--------------------------------------*/ 311cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 312cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void 313cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmerger_output (FILE *out) 314cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 315cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int n; 316cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project merger_list* p; 317cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 318cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fputs ("m4_define([b4_mergers], \n[[", out); 319cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (n = 1, p = merge_functions; p != NULL; n += 1, p = p->next) 320cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 321cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (p->type[0] == '\0') 322cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (out, " case %d: *yy0 = %s (*yy0, *yy1); break;\n", 323cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project n, p->name); 324cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project else 325cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (out, " case %d: yy0->%s = %s (*yy0, *yy1); break;\n", 326cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project n, p->type, p->name); 327cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 328cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fputs ("]])\n\n", out); 329cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 330cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 331cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*--------------------------------------. 332cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Output the tokens definition to OUT. | 333cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`--------------------------------------*/ 334cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 335cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void 336cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttoken_definitions_output (FILE *out) 337cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 338cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int i; 339cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project char const *sep = ""; 340cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 341cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fputs ("m4_define([b4_tokens], \n[", out); 342cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (i = 0; i < ntokens; ++i) 343cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 344cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project symbol *sym = symbols[i]; 345cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int number = sym->user_token_number; 346cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 347cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* At this stage, if there are literal aliases, they are part of 348cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project SYMBOLS, so we should not find symbols which are the aliases 349cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project here. */ 350cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project assert (number != USER_NUMBER_ALIAS); 351cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 352cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Skip error token. */ 353cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (sym == errtoken) 354cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project continue; 355cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 356cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* If this string has an alias, then it is necessarily the alias 357cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project which is to be output. */ 358cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (sym->alias) 359cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project sym = sym->alias; 360cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 361cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Don't output literal chars or strings (when defined only as a 362cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project string). Note that must be done after the alias resolution: 363cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project think about `%token 'f' "f"'. */ 364cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (sym->tag[0] == '\'' || sym->tag[0] == '\"') 365cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project continue; 366cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 367cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Don't #define nonliteral tokens whose names contain periods 368cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project or '$' (as does the default value of the EOF token). */ 369cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (strchr (sym->tag, '.') || strchr (sym->tag, '$')) 370cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project continue; 371cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 372cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (out, "%s[[[%s]], %d]", 373cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project sep, sym->tag, number); 374cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project sep = ",\n"; 375cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 376cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fputs ("])\n\n", out); 377cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 378cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 379cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 380cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*---------------------------------------. 381cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Output the symbol destructors to OUT. | 382cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`---------------------------------------*/ 383cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 384cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void 385cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsymbol_destructors_output (FILE *out) 386cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 387cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int i; 388cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project char const *sep = ""; 389cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 390cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fputs ("m4_define([b4_symbol_destructors], \n[", out); 391cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (i = 0; i < nsyms; ++i) 392cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (symbols[i]->destructor) 393cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 394cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project symbol *sym = symbols[i]; 395cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 396cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Filename, lineno, 397cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project Symbol-name, Symbol-number, 398cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project destructor, optional typename. */ 399cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (out, "%s[", sep); 400cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project sep = ",\n"; 401cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project escaped_output (out, sym->destructor_location.start.file); 402cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (out, ", %d, ", sym->destructor_location.start.line); 403cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project escaped_output (out, sym->tag); 404cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (out, ", %d, [[%s]]", sym->number, sym->destructor); 405cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (sym->type_name) 406cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (out, ", [[%s]]", sym->type_name); 407cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fputc (']', out); 408cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 409cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fputs ("])\n\n", out); 410cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 411cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 412cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 413cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*------------------------------------. 414cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Output the symbol printers to OUT. | 415cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`------------------------------------*/ 416cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 417cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void 418cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsymbol_printers_output (FILE *out) 419cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 420cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int i; 421cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project char const *sep = ""; 422cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 423cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fputs ("m4_define([b4_symbol_printers], \n[", out); 424cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (i = 0; i < nsyms; ++i) 425cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (symbols[i]->printer) 426cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 427cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project symbol *sym = symbols[i]; 428cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 429cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Filename, lineno, 430cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project Symbol-name, Symbol-number, 431cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project printer, optional typename. */ 432cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (out, "%s[", sep); 433cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project sep = ",\n"; 434cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project escaped_output (out, sym->printer_location.start.file); 435cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (out, ", %d, ", sym->printer_location.start.line); 436cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project escaped_output (out, sym->tag); 437cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (out, ", %d, [[%s]]", sym->number, sym->printer); 438cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (sym->type_name) 439cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (out, ", [[%s]]", sym->type_name); 440cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fputc (']', out); 441cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 442cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fputs ("])\n\n", out); 443cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 444cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 445cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 446cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void 447cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprepare_actions (void) 448cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 449cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Figure out the actions for the specified state, indexed by 450cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project look-ahead token type. */ 451cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 452cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project muscle_insert_rule_number_table ("defact", yydefact, 453cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project yydefact[0], 1, nstates); 454cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 455cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Figure out what to do after reducing with each rule, depending on 456cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project the saved state from before the beginning of parsing the data 457cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project that matched this rule. */ 458cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project muscle_insert_state_number_table ("defgoto", yydefgoto, 459cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project yydefgoto[0], 1, nsyms - ntokens); 460cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 461cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 462cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Output PACT. */ 463cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project muscle_insert_base_table ("pact", base, 464cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project base[0], 1, nstates); 465cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project MUSCLE_INSERT_INT ("pact_ninf", base_ninf); 466cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 467cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Output PGOTO. */ 468cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project muscle_insert_base_table ("pgoto", base, 469cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project base[nstates], nstates + 1, nvectors); 470cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 471cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project muscle_insert_base_table ("table", table, 472cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project table[0], 1, high + 1); 473cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project MUSCLE_INSERT_INT ("table_ninf", table_ninf); 474cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 475cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project muscle_insert_base_table ("check", check, 476cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project check[0], 1, high + 1); 477cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 478cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* GLR parsing slightly modifies YYTABLE and YYCHECK (and thus 479cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project YYPACT) so that in states with unresolved conflicts, the default 480cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project reduction is not used in the conflicted entries, so that there is 481cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project a place to put a conflict pointer. 482cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 483cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project This means that YYCONFLP and YYCONFL are nonsense for a non-GLR 484cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project parser, so we could avoid accidents by not writing them out in 485cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project that case. Nevertheless, it seems even better to be able to use 486cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project the GLR skeletons even without the non-deterministic tables. */ 487cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project muscle_insert_unsigned_int_table ("conflict_list_heads", conflict_table, 488cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project conflict_table[0], 1, high + 1); 489cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project muscle_insert_unsigned_int_table ("conflicting_rules", conflict_list, 490cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 0, 1, conflict_list_cnt); 491cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 492cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 493cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 494cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*---------------------------. 495cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Call the skeleton parser. | 496cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`---------------------------*/ 497cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 498cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void 499cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectoutput_skeleton (void) 500cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 501cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project FILE *in; 502cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project FILE *out; 503cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int filter_fd[2]; 504cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project char const *argv[6]; 505cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project pid_t pid; 506cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 507cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Compute the names of the package data dir and skeleton file. 508cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project Test whether m4sugar.m4 is readable, to check for proper 509cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project installation. A faulty installation can cause deadlock, so a 510cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project cheap sanity check is worthwhile. */ 511cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project char const m4sugar[] = "m4sugar/m4sugar.m4"; 512cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project char *full_m4sugar; 513cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project char *full_skeleton; 514cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project char const *p; 515cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project char const *m4 = (p = getenv ("M4")) ? p : M4; 516cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project char const *pkgdatadir = (p = getenv ("BISON_PKGDATADIR")) ? p : PKGDATADIR; 517cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project size_t skeleton_size = strlen (skeleton) + 1; 518cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project size_t pkgdatadirlen = strlen (pkgdatadir); 519cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project while (pkgdatadirlen && pkgdatadir[pkgdatadirlen - 1] == '/') 520cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project pkgdatadirlen--; 521cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project full_skeleton = xmalloc (pkgdatadirlen + 1 522cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project + (skeleton_size < sizeof m4sugar 523cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project ? sizeof m4sugar : skeleton_size)); 524cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project strcpy (full_skeleton, pkgdatadir); 525cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project full_skeleton[pkgdatadirlen] = '/'; 526cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project strcpy (full_skeleton + pkgdatadirlen + 1, m4sugar); 527cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project full_m4sugar = xstrdup (full_skeleton); 528cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project strcpy (full_skeleton + pkgdatadirlen + 1, skeleton); 529cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project xfclose (xfopen (full_m4sugar, "r")); 530cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 531cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Create an m4 subprocess connected to us via two pipes. */ 532cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 533cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (trace_flag & trace_tools) 534cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (stderr, "running: %s %s - %s\n", 535cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project m4, full_m4sugar, full_skeleton); 536cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 537cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project argv[0] = m4; 538cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project argv[1] = full_m4sugar; 539cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project argv[2] = "-"; 540cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project argv[3] = full_skeleton; 541cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project argv[4] = trace_flag & trace_m4 ? "-dV" : NULL; 542cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project argv[5] = NULL; 543cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 544cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project init_subpipe (); 545cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project pid = create_subpipe (argv, filter_fd); 546cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project free (full_m4sugar); 547cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project free (full_skeleton); 548cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 549cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project out = fdopen (filter_fd[0], "w"); 550cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (! out) 551cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project error (EXIT_FAILURE, get_errno (), 552cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "fdopen"); 553cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 554cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Output the definitions of all the muscles. */ 555cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fputs ("m4_init()\n", out); 556cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 557cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project user_actions_output (out); 558cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project merger_output (out); 559cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project token_definitions_output (out); 560cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project symbol_destructors_output (out); 561cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project symbol_printers_output (out); 562cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 563cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project muscles_m4_output (out); 564cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 565cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fputs ("m4_wrap([m4_divert_pop(0)])\n", out); 566cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fputs ("m4_divert_push(0)dnl\n", out); 567cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project xfclose (out); 568cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 569cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Read and process m4's output. */ 570cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project timevar_push (TV_M4); 571cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project end_of_output_subpipe (pid, filter_fd); 572cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project in = fdopen (filter_fd[1], "r"); 573cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (! in) 574cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project error (EXIT_FAILURE, get_errno (), 575cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "fdopen"); 576cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project scan_skel (in); 577cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project xfclose (in); 578cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project reap_subpipe (pid, m4); 579cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project timevar_pop (TV_M4); 580cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 581cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 582cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void 583cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprepare (void) 584cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 585cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Flags. */ 586cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project MUSCLE_INSERT_BOOL ("debug_flag", debug_flag); 587cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project MUSCLE_INSERT_BOOL ("defines_flag", defines_flag); 588cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project MUSCLE_INSERT_BOOL ("error_verbose_flag", error_verbose); 589cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project MUSCLE_INSERT_BOOL ("locations_flag", locations_flag); 590cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project MUSCLE_INSERT_BOOL ("pure_flag", pure_parser); 591cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project MUSCLE_INSERT_BOOL ("synclines_flag", !no_lines_flag); 592cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 593cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* File names. */ 594cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project MUSCLE_INSERT_STRING ("prefix", spec_name_prefix ? spec_name_prefix : "yy"); 595cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define DEFINE(Name) MUSCLE_INSERT_STRING (#Name, Name ? Name : "") 596cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project DEFINE (dir_prefix); 597cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project DEFINE (parser_file_name); 598cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project DEFINE (spec_defines_file); 599cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project DEFINE (spec_file_prefix); 600cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project DEFINE (spec_graph_file); 601cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project DEFINE (spec_name_prefix); 602cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project DEFINE (spec_outfile); 603cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project DEFINE (spec_verbose_file); 604cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#undef DEFINE 605cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 606cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* User Code. */ 607cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project obstack_1grow (&pre_prologue_obstack, 0); 608cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project obstack_1grow (&post_prologue_obstack, 0); 609cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project muscle_insert ("pre_prologue", obstack_finish (&pre_prologue_obstack)); 610cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project muscle_insert ("post_prologue", obstack_finish (&post_prologue_obstack)); 611cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 612cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Find the right skeleton file. */ 613cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (!skeleton) 614cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 615cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (glr_parser || nondeterministic_parser) 616cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project skeleton = "glr.c"; 617cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project else 618cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project skeleton = "yacc.c"; 619cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 620cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 621cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* About the skeletons. */ 622cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 623cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project char const *pkgdatadir = getenv ("BISON_PKGDATADIR"); 624cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project MUSCLE_INSERT_STRING ("pkgdatadir", pkgdatadir ? pkgdatadir : PKGDATADIR); 625cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project MUSCLE_INSERT_C_STRING ("skeleton", skeleton); 626cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 627cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 628cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 629cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 630cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*----------------------------------------------------------. 631cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Output the parsing tables and the parser code to ftable. | 632cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`----------------------------------------------------------*/ 633cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 634cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid 635cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectoutput (void) 636cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 637cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project obstack_init (&format_obstack); 638cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 639cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project prepare_symbols (); 640cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project prepare_rules (); 641cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project prepare_states (); 642cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project prepare_actions (); 643cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 644cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project prepare (); 645cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 646cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Process the selected skeleton file. */ 647cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project output_skeleton (); 648cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 649cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project obstack_free (&format_obstack, NULL); 650cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project obstack_free (&pre_prologue_obstack, NULL); 651cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project obstack_free (&post_prologue_obstack, NULL); 652cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 653