1cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Output the generated parsing program for Bison. 2cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 305436638acc7c010349a69c3395f1a57c642dc62Ying Wang Copyright (C) 1984, 1986, 1989, 1992, 2000-2012 Free Software 405436638acc7c010349a69c3395f1a57c642dc62Ying Wang Foundation, Inc. 5cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 6cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project This file is part of Bison, the GNU Compiler Compiler. 7cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 805436638acc7c010349a69c3395f1a57c642dc62Ying Wang This program is free software: you can redistribute it and/or modify 905436638acc7c010349a69c3395f1a57c642dc62Ying Wang it under the terms of the GNU General Public License as published by 1005436638acc7c010349a69c3395f1a57c642dc62Ying Wang the Free Software Foundation, either version 3 of the License, or 1105436638acc7c010349a69c3395f1a57c642dc62Ying Wang (at your option) any later version. 12cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 1305436638acc7c010349a69c3395f1a57c642dc62Ying Wang This program is distributed in the hope that it will be useful, 1405436638acc7c010349a69c3395f1a57c642dc62Ying Wang but WITHOUT ANY WARRANTY; without even the implied warranty of 1505436638acc7c010349a69c3395f1a57c642dc62Ying Wang MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1605436638acc7c010349a69c3395f1a57c642dc62Ying Wang GNU General Public License for more details. 17cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 18cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project You should have received a copy of the GNU General Public License 1905436638acc7c010349a69c3395f1a57c642dc62Ying Wang along with this program. If not, see <http://www.gnu.org/licenses/>. */ 20cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 21cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <config.h> 22cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "system.h" 23cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 2405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include <configmake.h> 25cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <error.h> 26cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <get-errno.h> 27cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <quotearg.h> 2805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include <spawn-pipe.h> 29cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <timevar.h> 3005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include <wait-process.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" 3605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include "muscle-tab.h" 37cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "output.h" 38cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "reader.h" 3905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include "scan-code.h" /* max_left_semantic_context */ 40cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "scan-skel.h" 41cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "symtab.h" 42cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "tables.h" 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 \ 7105436638acc7c010349a69c3395f1a57c642dc62Ying Wang obstack_printf (&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; \ 8205436638acc7c010349a69c3395f1a57c642dc62Ying Wang obstack_printf (&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. */ \ 9405436638acc7c010349a69c3395f1a57c642dc62Ying Wang obstack_printf (&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); \ 9705436638acc7c010349a69c3395f1a57c642dc62Ying Wang obstack_printf (&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 11105436638acc7c010349a69c3395f1a57c642dc62Ying Wang/*----------------------------------------------------------------. 11205436638acc7c010349a69c3395f1a57c642dc62Ying Wang| Print to OUT a representation of CP quoted and escaped for M4. | 11305436638acc7c010349a69c3395f1a57c642dc62Ying Wang`----------------------------------------------------------------*/ 114cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 115cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void 11605436638acc7c010349a69c3395f1a57c642dc62Ying Wangquoted_output (FILE *out, char const *cp) 117cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 118cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (out, "[["); 119cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 12005436638acc7c010349a69c3395f1a57c642dc62Ying Wang for (; *cp; cp++) 12105436638acc7c010349a69c3395f1a57c642dc62Ying Wang switch (*cp) 122cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 123cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project case '$': fputs ("$][", out); break; 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; 12705436638acc7c010349a69c3395f1a57c642dc62Ying Wang default: fputc (*cp, out); break; 128cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 129cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 130cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (out, "]]"); 131cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 132cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 13305436638acc7c010349a69c3395f1a57c642dc62Ying Wang/*----------------------------------------------------------------. 13405436638acc7c010349a69c3395f1a57c642dc62Ying Wang| Print to OUT a representation of STRING quoted and escaped both | 13505436638acc7c010349a69c3395f1a57c642dc62Ying Wang| for C and M4. | 13605436638acc7c010349a69c3395f1a57c642dc62Ying Wang`----------------------------------------------------------------*/ 13705436638acc7c010349a69c3395f1a57c642dc62Ying Wang 13805436638acc7c010349a69c3395f1a57c642dc62Ying Wangstatic void 13905436638acc7c010349a69c3395f1a57c642dc62Ying Wangstring_output (FILE *out, char const *string) 14005436638acc7c010349a69c3395f1a57c642dc62Ying Wang{ 14105436638acc7c010349a69c3395f1a57c642dc62Ying Wang quoted_output (out, quotearg_style (c_quoting_style, string)); 14205436638acc7c010349a69c3395f1a57c642dc62Ying Wang} 14305436638acc7c010349a69c3395f1a57c642dc62Ying Wang 144cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 145cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*------------------------------------------------------------------. 146cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Prepare the muscles related to the symbols: translate, tname, and | 147cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| toknum. | 148cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`------------------------------------------------------------------*/ 149cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 150cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void 151cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprepare_symbols (void) 152cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 153cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project MUSCLE_INSERT_INT ("tokens_number", ntokens); 154cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project MUSCLE_INSERT_INT ("nterms_number", nvars); 155cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project MUSCLE_INSERT_INT ("undef_token_number", undeftoken->number); 156cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project MUSCLE_INSERT_INT ("user_token_number_max", max_user_token_number); 157cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 158cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project muscle_insert_symbol_number_table ("translate", 159cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project token_translations, 160cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project token_translations[0], 161cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 1, max_user_token_number + 1); 162cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 163cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* tname -- token names. */ 164cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 165cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int i; 166cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* We assume that the table will be output starting at column 2. */ 167cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int j = 2; 16805436638acc7c010349a69c3395f1a57c642dc62Ying Wang struct quoting_options *qo = clone_quoting_options (0); 16905436638acc7c010349a69c3395f1a57c642dc62Ying Wang set_quoting_style (qo, c_quoting_style); 17005436638acc7c010349a69c3395f1a57c642dc62Ying Wang set_quoting_flags (qo, QA_SPLIT_TRIGRAPHS); 171cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (i = 0; i < nsyms; i++) 172cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 17305436638acc7c010349a69c3395f1a57c642dc62Ying Wang char *cp = quotearg_alloc (symbols[i]->tag, -1, qo); 174cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Width of the next token, including the two quotes, the 175cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project comma and the space. */ 176cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int width = strlen (cp) + 2; 177cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 178cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (j + width > 75) 179cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 180cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project obstack_sgrow (&format_obstack, "\n "); 181cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project j = 1; 182cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 183cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 184cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (i) 185cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project obstack_1grow (&format_obstack, ' '); 18605436638acc7c010349a69c3395f1a57c642dc62Ying Wang obstack_escape (&format_obstack, cp); 18705436638acc7c010349a69c3395f1a57c642dc62Ying Wang free (cp); 188cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project obstack_1grow (&format_obstack, ','); 189cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project j += width; 190cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 19105436638acc7c010349a69c3395f1a57c642dc62Ying Wang free (qo); 19205436638acc7c010349a69c3395f1a57c642dc62Ying Wang obstack_sgrow (&format_obstack, " ]b4_null["); 193cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 194cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Finish table and store. */ 195cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project obstack_1grow (&format_obstack, 0); 196cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project muscle_insert ("tname", obstack_finish (&format_obstack)); 197cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 198cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 199cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Output YYTOKNUM. */ 200cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 201cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int i; 202cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int *values = xnmalloc (ntokens, sizeof *values); 203cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (i = 0; i < ntokens; ++i) 204cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project values[i] = symbols[i]->user_token_number; 205cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project muscle_insert_int_table ("toknum", values, 206cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project values[0], 1, ntokens); 207cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project free (values); 208cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 209cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 210cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 211cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 212cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*-------------------------------------------------------------. 213cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Prepare the muscles related to the rules: rhs, prhs, r1, r2, | 214cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| rline, dprec, merger. | 215cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`-------------------------------------------------------------*/ 216cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 217cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void 218cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprepare_rules (void) 219cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 220cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project rule_number r; 221cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project unsigned int i = 0; 222cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project item_number *rhs = xnmalloc (nritems, sizeof *rhs); 223cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project unsigned int *prhs = xnmalloc (nrules, sizeof *prhs); 224cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project unsigned int *rline = xnmalloc (nrules, sizeof *rline); 225cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project symbol_number *r1 = xnmalloc (nrules, sizeof *r1); 226cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project unsigned int *r2 = xnmalloc (nrules, sizeof *r2); 227cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int *dprec = xnmalloc (nrules, sizeof *dprec); 228cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int *merger = xnmalloc (nrules, sizeof *merger); 229cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 230cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (r = 0; r < nrules; ++r) 231cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 232cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project item_number *rhsp = NULL; 233cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Index of rule R in RHS. */ 234cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project prhs[r] = i; 235cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* RHS of the rule R. */ 236cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (rhsp = rules[r].rhs; *rhsp >= 0; ++rhsp) 237cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project rhs[i++] = *rhsp; 238cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* LHS of the rule R. */ 239cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project r1[r] = rules[r].lhs->number; 240cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Length of rule R's RHS. */ 241cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project r2[r] = i - prhs[r]; 242cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Separator in RHS. */ 243cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project rhs[i++] = -1; 244cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Line where rule was defined. */ 245cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project rline[r] = rules[r].location.start.line; 246cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Dynamic precedence (GLR). */ 247cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project dprec[r] = rules[r].dprec; 248cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Merger-function index (GLR). */ 249cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project merger[r] = rules[r].merger; 250cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 25105436638acc7c010349a69c3395f1a57c642dc62Ying Wang aver (i == nritems); 252cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 253cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project muscle_insert_item_number_table ("rhs", rhs, ritem[0], 1, nritems); 254cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project muscle_insert_unsigned_int_table ("prhs", prhs, 0, 0, nrules); 255cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project muscle_insert_unsigned_int_table ("rline", rline, 0, 0, nrules); 256cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project muscle_insert_symbol_number_table ("r1", r1, 0, 0, nrules); 257cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project muscle_insert_unsigned_int_table ("r2", r2, 0, 0, nrules); 258cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project muscle_insert_int_table ("dprec", dprec, 0, 0, nrules); 259cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project muscle_insert_int_table ("merger", merger, 0, 0, nrules); 260cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 261cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project MUSCLE_INSERT_INT ("rules_number", nrules); 262cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project MUSCLE_INSERT_INT ("max_left_semantic_context", max_left_semantic_context); 263cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 264cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project free (rhs); 265cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project free (prhs); 266cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project free (rline); 267cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project free (r1); 268cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project free (r2); 269cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project free (dprec); 270cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project free (merger); 271cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 272cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 273cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*--------------------------------------------. 274cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Prepare the muscles related to the states. | 275cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`--------------------------------------------*/ 276cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 277cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void 278cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprepare_states (void) 279cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 280cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project state_number i; 281cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project symbol_number *values = xnmalloc (nstates, sizeof *values); 282cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (i = 0; i < nstates; ++i) 283cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project values[i] = states[i]->accessing_symbol; 284cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project muscle_insert_symbol_number_table ("stos", values, 285cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 0, 1, nstates); 286cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project free (values); 287cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 288cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project MUSCLE_INSERT_INT ("last", high); 289cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project MUSCLE_INSERT_INT ("final_state_number", final_state->number); 290cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project MUSCLE_INSERT_INT ("states_number", nstates); 291cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 292cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 293cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 294cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 295cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*---------------------------------. 296cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Output the user actions to OUT. | 297cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`---------------------------------*/ 298cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 299cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void 300cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectuser_actions_output (FILE *out) 301cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 302cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project rule_number r; 303cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 30405436638acc7c010349a69c3395f1a57c642dc62Ying Wang fputs ("m4_define([b4_actions], \n[", out); 305cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (r = 0; r < nrules; ++r) 306cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (rules[r].action) 307cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 30805436638acc7c010349a69c3395f1a57c642dc62Ying Wang fprintf (out, "b4_case(%d, [b4_syncline(%d, ", r + 1, 309cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project rules[r].action_location.start.line); 31005436638acc7c010349a69c3395f1a57c642dc62Ying Wang string_output (out, rules[r].action_location.start.file); 31105436638acc7c010349a69c3395f1a57c642dc62Ying Wang fprintf (out, ")\n[ %s]])\n\n", rules[r].action); 312cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 31305436638acc7c010349a69c3395f1a57c642dc62Ying Wang fputs ("])\n\n", out); 314cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 315cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 316cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*--------------------------------------. 317cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Output the merge functions to OUT. | 318cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`--------------------------------------*/ 319cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 320cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void 321cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmerger_output (FILE *out) 322cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 323cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int n; 324cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project merger_list* p; 325cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 326cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fputs ("m4_define([b4_mergers], \n[[", out); 327cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (n = 1, p = merge_functions; p != NULL; n += 1, p = p->next) 328cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 329cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (p->type[0] == '\0') 330cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (out, " case %d: *yy0 = %s (*yy0, *yy1); break;\n", 331cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project n, p->name); 332cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project else 333cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (out, " case %d: yy0->%s = %s (*yy0, *yy1); break;\n", 334cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project n, p->type, p->name); 335cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 336cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fputs ("]])\n\n", out); 337cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 338cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 339cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*--------------------------------------. 340cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Output the tokens definition to OUT. | 341cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`--------------------------------------*/ 342cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 343cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void 344cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttoken_definitions_output (FILE *out) 345cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 346cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int i; 347cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project char const *sep = ""; 348cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 349cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fputs ("m4_define([b4_tokens], \n[", out); 350cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (i = 0; i < ntokens; ++i) 351cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 352cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project symbol *sym = symbols[i]; 353cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int number = sym->user_token_number; 354cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 35505436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* At this stage, if there are literal string aliases, they are 35605436638acc7c010349a69c3395f1a57c642dc62Ying Wang part of SYMBOLS, so we should not find their aliased symbols 35705436638acc7c010349a69c3395f1a57c642dc62Ying Wang here. */ 35805436638acc7c010349a69c3395f1a57c642dc62Ying Wang aver (number != USER_NUMBER_HAS_STRING_ALIAS); 359cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 360cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Skip error token. */ 361cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (sym == errtoken) 362cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project continue; 363cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 364cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* If this string has an alias, then it is necessarily the alias 365cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project which is to be output. */ 366cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (sym->alias) 367cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project sym = sym->alias; 368cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 369cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Don't output literal chars or strings (when defined only as a 370cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project string). Note that must be done after the alias resolution: 371cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project think about `%token 'f' "f"'. */ 372cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (sym->tag[0] == '\'' || sym->tag[0] == '\"') 373cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project continue; 374cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 37505436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* Don't #define nonliteral tokens whose names contain periods, 37605436638acc7c010349a69c3395f1a57c642dc62Ying Wang dashes or '$' (as does the default value of the EOF token). */ 37705436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (mbschr (sym->tag, '.') 37805436638acc7c010349a69c3395f1a57c642dc62Ying Wang || mbschr (sym->tag, '-') 37905436638acc7c010349a69c3395f1a57c642dc62Ying Wang || mbschr (sym->tag, '$')) 380cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project continue; 381cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 382cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (out, "%s[[[%s]], %d]", 383cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project sep, sym->tag, number); 384cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project sep = ",\n"; 385cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 386cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fputs ("])\n\n", out); 387cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 388cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 389cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 39005436638acc7c010349a69c3395f1a57c642dc62Ying Wang/*---------------------------------------------------. 39105436638acc7c010349a69c3395f1a57c642dc62Ying Wang| Output the symbol destructors or printers to OUT. | 39205436638acc7c010349a69c3395f1a57c642dc62Ying Wang`---------------------------------------------------*/ 393cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 394cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void 39505436638acc7c010349a69c3395f1a57c642dc62Ying Wangsymbol_code_props_output (FILE *out, char const *what, 39605436638acc7c010349a69c3395f1a57c642dc62Ying Wang code_props const *(*get)(symbol const *)) 397cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 398cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int i; 399cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project char const *sep = ""; 400cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 40105436638acc7c010349a69c3395f1a57c642dc62Ying Wang fputs ("m4_define([b4_symbol_", out); 40205436638acc7c010349a69c3395f1a57c642dc62Ying Wang fputs (what, out); 40305436638acc7c010349a69c3395f1a57c642dc62Ying Wang fputs ("], \n[", out); 404cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (i = 0; i < nsyms; ++i) 40505436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 40605436638acc7c010349a69c3395f1a57c642dc62Ying Wang symbol *sym = symbols[i]; 40705436638acc7c010349a69c3395f1a57c642dc62Ying Wang char const *code = (*get) (sym)->code; 40805436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (code) 40905436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 41005436638acc7c010349a69c3395f1a57c642dc62Ying Wang location loc = (*get) (sym)->location; 41105436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* Filename, lineno, 41205436638acc7c010349a69c3395f1a57c642dc62Ying Wang Symbol-name, Symbol-number, 41305436638acc7c010349a69c3395f1a57c642dc62Ying Wang code, optional typename. */ 41405436638acc7c010349a69c3395f1a57c642dc62Ying Wang fprintf (out, "%s[", sep); 41505436638acc7c010349a69c3395f1a57c642dc62Ying Wang sep = ",\n"; 41605436638acc7c010349a69c3395f1a57c642dc62Ying Wang string_output (out, loc.start.file); 41705436638acc7c010349a69c3395f1a57c642dc62Ying Wang fprintf (out, ", %d, ", loc.start.line); 41805436638acc7c010349a69c3395f1a57c642dc62Ying Wang quoted_output (out, sym->tag); 41905436638acc7c010349a69c3395f1a57c642dc62Ying Wang fprintf (out, ", %d, [[%s]]", sym->number, code); 42005436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (sym->type_name) 42105436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 42205436638acc7c010349a69c3395f1a57c642dc62Ying Wang fputs (", ", out); 42305436638acc7c010349a69c3395f1a57c642dc62Ying Wang quoted_output (out, sym->type_name); 42405436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 42505436638acc7c010349a69c3395f1a57c642dc62Ying Wang fputc (']', out); 42605436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 42705436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 428cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fputs ("])\n\n", out); 429cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 430cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 431cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 432cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void 433cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprepare_actions (void) 434cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 435cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Figure out the actions for the specified state, indexed by 43605436638acc7c010349a69c3395f1a57c642dc62Ying Wang lookahead token type. */ 437cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 438cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project muscle_insert_rule_number_table ("defact", yydefact, 439cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project yydefact[0], 1, nstates); 440cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 441cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Figure out what to do after reducing with each rule, depending on 442cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project the saved state from before the beginning of parsing the data 443cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project that matched this rule. */ 444cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project muscle_insert_state_number_table ("defgoto", yydefgoto, 445cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project yydefgoto[0], 1, nsyms - ntokens); 446cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 447cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 448cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Output PACT. */ 449cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project muscle_insert_base_table ("pact", base, 450cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project base[0], 1, nstates); 451cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project MUSCLE_INSERT_INT ("pact_ninf", base_ninf); 452cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 453cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Output PGOTO. */ 454cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project muscle_insert_base_table ("pgoto", base, 455cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project base[nstates], nstates + 1, nvectors); 456cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 457cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project muscle_insert_base_table ("table", table, 458cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project table[0], 1, high + 1); 459cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project MUSCLE_INSERT_INT ("table_ninf", table_ninf); 460cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 461cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project muscle_insert_base_table ("check", check, 462cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project check[0], 1, high + 1); 463cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 464cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* GLR parsing slightly modifies YYTABLE and YYCHECK (and thus 465cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project YYPACT) so that in states with unresolved conflicts, the default 466cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project reduction is not used in the conflicted entries, so that there is 467cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project a place to put a conflict pointer. 468cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 469cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project This means that YYCONFLP and YYCONFL are nonsense for a non-GLR 470cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project parser, so we could avoid accidents by not writing them out in 471cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project that case. Nevertheless, it seems even better to be able to use 472cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project the GLR skeletons even without the non-deterministic tables. */ 473cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project muscle_insert_unsigned_int_table ("conflict_list_heads", conflict_table, 474cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project conflict_table[0], 1, high + 1); 475cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project muscle_insert_unsigned_int_table ("conflicting_rules", conflict_list, 476cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 0, 1, conflict_list_cnt); 477cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 478cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 47905436638acc7c010349a69c3395f1a57c642dc62Ying Wang/*--------------------------------------------. 48005436638acc7c010349a69c3395f1a57c642dc62Ying Wang| Output the definitions of all the muscles. | 48105436638acc7c010349a69c3395f1a57c642dc62Ying Wang`--------------------------------------------*/ 48205436638acc7c010349a69c3395f1a57c642dc62Ying Wang 48305436638acc7c010349a69c3395f1a57c642dc62Ying Wangstatic void 48405436638acc7c010349a69c3395f1a57c642dc62Ying Wangmuscles_output (FILE *out) 48505436638acc7c010349a69c3395f1a57c642dc62Ying Wang{ 48605436638acc7c010349a69c3395f1a57c642dc62Ying Wang fputs ("m4_init()\n", out); 48705436638acc7c010349a69c3395f1a57c642dc62Ying Wang 48805436638acc7c010349a69c3395f1a57c642dc62Ying Wang user_actions_output (out); 48905436638acc7c010349a69c3395f1a57c642dc62Ying Wang merger_output (out); 49005436638acc7c010349a69c3395f1a57c642dc62Ying Wang token_definitions_output (out); 49105436638acc7c010349a69c3395f1a57c642dc62Ying Wang symbol_code_props_output (out, "destructors", &symbol_destructor_get); 49205436638acc7c010349a69c3395f1a57c642dc62Ying Wang symbol_code_props_output (out, "printers", &symbol_printer_get); 49305436638acc7c010349a69c3395f1a57c642dc62Ying Wang 49405436638acc7c010349a69c3395f1a57c642dc62Ying Wang muscles_m4_output (out); 49505436638acc7c010349a69c3395f1a57c642dc62Ying Wang} 496cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 497cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*---------------------------. 498cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Call the skeleton parser. | 499cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`---------------------------*/ 500cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 501cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void 502cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectoutput_skeleton (void) 503cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 504cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project FILE *in; 505cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int filter_fd[2]; 50605436638acc7c010349a69c3395f1a57c642dc62Ying Wang char const *argv[10]; 507cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project pid_t pid; 508cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 50905436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* Compute the names of the package data dir and skeleton files. */ 510cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project char const m4sugar[] = "m4sugar/m4sugar.m4"; 51105436638acc7c010349a69c3395f1a57c642dc62Ying Wang char const m4bison[] = "bison.m4"; 512cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project char *full_m4sugar; 51305436638acc7c010349a69c3395f1a57c642dc62Ying Wang char *full_m4bison; 514cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project char *full_skeleton; 515cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project char const *p; 516cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project char const *m4 = (p = getenv ("M4")) ? p : M4; 51705436638acc7c010349a69c3395f1a57c642dc62Ying Wang char const *pkgdatadir = compute_pkgdatadir (); 518cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project size_t skeleton_size = strlen (skeleton) + 1; 519cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project size_t pkgdatadirlen = strlen (pkgdatadir); 520cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project while (pkgdatadirlen && pkgdatadir[pkgdatadirlen - 1] == '/') 521cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project pkgdatadirlen--; 522cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project full_skeleton = xmalloc (pkgdatadirlen + 1 523cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project + (skeleton_size < sizeof m4sugar 524cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project ? sizeof m4sugar : skeleton_size)); 52505436638acc7c010349a69c3395f1a57c642dc62Ying Wang memcpy (full_skeleton, pkgdatadir, pkgdatadirlen); 526cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project full_skeleton[pkgdatadirlen] = '/'; 527cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project strcpy (full_skeleton + pkgdatadirlen + 1, m4sugar); 528cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project full_m4sugar = xstrdup (full_skeleton); 52905436638acc7c010349a69c3395f1a57c642dc62Ying Wang strcpy (full_skeleton + pkgdatadirlen + 1, m4bison); 53005436638acc7c010349a69c3395f1a57c642dc62Ying Wang full_m4bison = xstrdup (full_skeleton); 53105436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (mbschr (skeleton, '/')) 53205436638acc7c010349a69c3395f1a57c642dc62Ying Wang strcpy (full_skeleton, skeleton); 53305436638acc7c010349a69c3395f1a57c642dc62Ying Wang else 53405436638acc7c010349a69c3395f1a57c642dc62Ying Wang strcpy (full_skeleton + pkgdatadirlen + 1, skeleton); 53505436638acc7c010349a69c3395f1a57c642dc62Ying Wang 53605436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* Test whether m4sugar.m4 is readable, to check for proper 53705436638acc7c010349a69c3395f1a57c642dc62Ying Wang installation. A faulty installation can cause deadlock, so a 53805436638acc7c010349a69c3395f1a57c642dc62Ying Wang cheap sanity check is worthwhile. */ 539cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project xfclose (xfopen (full_m4sugar, "r")); 540cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 541cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Create an m4 subprocess connected to us via two pipes. */ 542cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 543cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (trace_flag & trace_tools) 54405436638acc7c010349a69c3395f1a57c642dc62Ying Wang fprintf (stderr, "running: %s %s - %s %s\n", 54505436638acc7c010349a69c3395f1a57c642dc62Ying Wang m4, full_m4sugar, full_m4bison, full_skeleton); 546cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 54705436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* Some future version of GNU M4 (most likely 1.6) may treat the -dV in a 54805436638acc7c010349a69c3395f1a57c642dc62Ying Wang position-dependent manner. Keep it as the first argument so that all 54905436638acc7c010349a69c3395f1a57c642dc62Ying Wang files are traced. 550cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 55105436638acc7c010349a69c3395f1a57c642dc62Ying Wang See the thread starting at 55205436638acc7c010349a69c3395f1a57c642dc62Ying Wang <http://lists.gnu.org/archive/html/bug-bison/2008-07/msg00000.html> 55305436638acc7c010349a69c3395f1a57c642dc62Ying Wang for details. */ 55405436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 55505436638acc7c010349a69c3395f1a57c642dc62Ying Wang int i = 0; 55605436638acc7c010349a69c3395f1a57c642dc62Ying Wang argv[i++] = m4; 55705436638acc7c010349a69c3395f1a57c642dc62Ying Wang 55805436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* When POSIXLY_CORRECT is set, GNU M4 1.6 and later disable GNU 55905436638acc7c010349a69c3395f1a57c642dc62Ying Wang extensions, which Bison's skeletons depend on. With older M4, 56005436638acc7c010349a69c3395f1a57c642dc62Ying Wang it has no effect. M4 1.4.12 added a -g/--gnu command-line 56105436638acc7c010349a69c3395f1a57c642dc62Ying Wang option to make it explicit that a program wants GNU M4 56205436638acc7c010349a69c3395f1a57c642dc62Ying Wang extensions even when POSIXLY_CORRECT is set. 56305436638acc7c010349a69c3395f1a57c642dc62Ying Wang 56405436638acc7c010349a69c3395f1a57c642dc62Ying Wang See the thread starting at 56505436638acc7c010349a69c3395f1a57c642dc62Ying Wang <http://lists.gnu.org/archive/html/bug-bison/2008-07/msg00000.html> 56605436638acc7c010349a69c3395f1a57c642dc62Ying Wang for details. */ 56705436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (*M4_GNU_OPTION) 56805436638acc7c010349a69c3395f1a57c642dc62Ying Wang argv[i++] = M4_GNU_OPTION; 56905436638acc7c010349a69c3395f1a57c642dc62Ying Wang 57005436638acc7c010349a69c3395f1a57c642dc62Ying Wang argv[i++] = "-I"; 57105436638acc7c010349a69c3395f1a57c642dc62Ying Wang argv[i++] = pkgdatadir; 57205436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (trace_flag & trace_m4) 57305436638acc7c010349a69c3395f1a57c642dc62Ying Wang argv[i++] = "-dV"; 57405436638acc7c010349a69c3395f1a57c642dc62Ying Wang argv[i++] = full_m4sugar; 57505436638acc7c010349a69c3395f1a57c642dc62Ying Wang argv[i++] = "-"; 57605436638acc7c010349a69c3395f1a57c642dc62Ying Wang argv[i++] = full_m4bison; 57705436638acc7c010349a69c3395f1a57c642dc62Ying Wang argv[i++] = full_skeleton; 57805436638acc7c010349a69c3395f1a57c642dc62Ying Wang argv[i++] = NULL; 57905436638acc7c010349a69c3395f1a57c642dc62Ying Wang aver (i <= ARRAY_CARDINALITY (argv)); 58005436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 581cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 58205436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* The ugly cast is because gnulib gets the const-ness wrong. */ 58305436638acc7c010349a69c3395f1a57c642dc62Ying Wang pid = create_pipe_bidi ("m4", m4, (char **)(void*)argv, false, true, 58405436638acc7c010349a69c3395f1a57c642dc62Ying Wang true, filter_fd); 58505436638acc7c010349a69c3395f1a57c642dc62Ying Wang free (full_m4sugar); 58605436638acc7c010349a69c3395f1a57c642dc62Ying Wang free (full_m4bison); 58705436638acc7c010349a69c3395f1a57c642dc62Ying Wang free (full_skeleton); 588cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 58905436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (trace_flag & trace_muscles) 59005436638acc7c010349a69c3395f1a57c642dc62Ying Wang muscles_output (stderr); 59105436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 59205436638acc7c010349a69c3395f1a57c642dc62Ying Wang FILE *out = fdopen (filter_fd[1], "w"); 59305436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (! out) 59405436638acc7c010349a69c3395f1a57c642dc62Ying Wang error (EXIT_FAILURE, get_errno (), 59505436638acc7c010349a69c3395f1a57c642dc62Ying Wang "fdopen"); 59605436638acc7c010349a69c3395f1a57c642dc62Ying Wang muscles_output (out); 59705436638acc7c010349a69c3395f1a57c642dc62Ying Wang xfclose (out); 59805436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 599cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 600cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Read and process m4's output. */ 601cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project timevar_push (TV_M4); 60205436638acc7c010349a69c3395f1a57c642dc62Ying Wang in = fdopen (filter_fd[0], "r"); 603cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (! in) 604cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project error (EXIT_FAILURE, get_errno (), 605cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "fdopen"); 606cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project scan_skel (in); 60705436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* scan_skel should have read all of M4's output. Otherwise, when we 60805436638acc7c010349a69c3395f1a57c642dc62Ying Wang close the pipe, we risk letting M4 report a broken-pipe to the 60905436638acc7c010349a69c3395f1a57c642dc62Ying Wang Bison user. */ 61005436638acc7c010349a69c3395f1a57c642dc62Ying Wang aver (feof (in)); 611cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project xfclose (in); 61205436638acc7c010349a69c3395f1a57c642dc62Ying Wang wait_subprocess (pid, "m4", false, false, true, true, NULL); 613cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project timevar_pop (TV_M4); 614cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 615cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 616cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void 617cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprepare (void) 618cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 61905436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* BISON_USE_PUSH_FOR_PULL is for the test suite and should not be documented 62005436638acc7c010349a69c3395f1a57c642dc62Ying Wang for the user. */ 62105436638acc7c010349a69c3395f1a57c642dc62Ying Wang char const *use_push_for_pull_env = getenv ("BISON_USE_PUSH_FOR_PULL"); 62205436638acc7c010349a69c3395f1a57c642dc62Ying Wang bool use_push_for_pull_flag = false; 62305436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (use_push_for_pull_env != NULL 62405436638acc7c010349a69c3395f1a57c642dc62Ying Wang && use_push_for_pull_env[0] != '\0' 62505436638acc7c010349a69c3395f1a57c642dc62Ying Wang && 0 != strcmp (use_push_for_pull_env, "0")) 62605436638acc7c010349a69c3395f1a57c642dc62Ying Wang use_push_for_pull_flag = true; 62705436638acc7c010349a69c3395f1a57c642dc62Ying Wang 628cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Flags. */ 62905436638acc7c010349a69c3395f1a57c642dc62Ying Wang MUSCLE_INSERT_BOOL ("debug_flag", debug); 630cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project MUSCLE_INSERT_BOOL ("defines_flag", defines_flag); 631cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project MUSCLE_INSERT_BOOL ("error_verbose_flag", error_verbose); 63205436638acc7c010349a69c3395f1a57c642dc62Ying Wang MUSCLE_INSERT_BOOL ("glr_flag", glr_parser); 633cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project MUSCLE_INSERT_BOOL ("locations_flag", locations_flag); 63405436638acc7c010349a69c3395f1a57c642dc62Ying Wang MUSCLE_INSERT_BOOL ("nondeterministic_flag", nondeterministic_parser); 635cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project MUSCLE_INSERT_BOOL ("synclines_flag", !no_lines_flag); 63605436638acc7c010349a69c3395f1a57c642dc62Ying Wang MUSCLE_INSERT_BOOL ("tag_seen_flag", tag_seen); 63705436638acc7c010349a69c3395f1a57c642dc62Ying Wang MUSCLE_INSERT_BOOL ("token_table_flag", token_table_flag); 63805436638acc7c010349a69c3395f1a57c642dc62Ying Wang MUSCLE_INSERT_BOOL ("use_push_for_pull_flag", use_push_for_pull_flag); 63905436638acc7c010349a69c3395f1a57c642dc62Ying Wang MUSCLE_INSERT_BOOL ("yacc_flag", yacc_flag); 640cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 641cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* File names. */ 64205436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (spec_name_prefix) 64305436638acc7c010349a69c3395f1a57c642dc62Ying Wang MUSCLE_INSERT_STRING ("prefix", spec_name_prefix); 64405436638acc7c010349a69c3395f1a57c642dc62Ying Wang 64505436638acc7c010349a69c3395f1a57c642dc62Ying Wang MUSCLE_INSERT_STRING ("file_name_all_but_ext", all_but_ext); 64605436638acc7c010349a69c3395f1a57c642dc62Ying Wang 647cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define DEFINE(Name) MUSCLE_INSERT_STRING (#Name, Name ? Name : "") 648cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project DEFINE (dir_prefix); 649cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project DEFINE (parser_file_name); 650cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project DEFINE (spec_defines_file); 651cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project DEFINE (spec_file_prefix); 652cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project DEFINE (spec_graph_file); 653cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project DEFINE (spec_name_prefix); 654cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project DEFINE (spec_outfile); 655cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project DEFINE (spec_verbose_file); 656cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#undef DEFINE 657cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 65805436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* Find the right skeleton file, and add muscles about the skeletons. */ 65905436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (skeleton) 66005436638acc7c010349a69c3395f1a57c642dc62Ying Wang MUSCLE_INSERT_C_STRING ("skeleton", skeleton); 66105436638acc7c010349a69c3395f1a57c642dc62Ying Wang else 66205436638acc7c010349a69c3395f1a57c642dc62Ying Wang skeleton = language->skeleton; 663cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 66405436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* About the skeletons. */ 665cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 66605436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* b4_pkgdatadir is used inside m4_include in the skeletons, so digraphs 66705436638acc7c010349a69c3395f1a57c642dc62Ying Wang would never be expanded. Hopefully no one has M4-special characters in 66805436638acc7c010349a69c3395f1a57c642dc62Ying Wang his Bison installation path. */ 66905436638acc7c010349a69c3395f1a57c642dc62Ying Wang MUSCLE_INSERT_STRING_RAW ("pkgdatadir", compute_pkgdatadir ()); 670cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 671cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 672cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 673cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 674cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*----------------------------------------------------------. 675cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Output the parsing tables and the parser code to ftable. | 676cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`----------------------------------------------------------*/ 677cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 678cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid 679cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectoutput (void) 680cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 681cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project obstack_init (&format_obstack); 682cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 683cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project prepare_symbols (); 684cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project prepare_rules (); 685cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project prepare_states (); 686cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project prepare_actions (); 687cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 688cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project prepare (); 689cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 690cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Process the selected skeleton file. */ 691cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project output_skeleton (); 692cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 693cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project obstack_free (&format_obstack, NULL); 69405436638acc7c010349a69c3395f1a57c642dc62Ying Wang} 69505436638acc7c010349a69c3395f1a57c642dc62Ying Wang 69605436638acc7c010349a69c3395f1a57c642dc62Ying Wangchar const * 69705436638acc7c010349a69c3395f1a57c642dc62Ying Wangcompute_pkgdatadir (void) 69805436638acc7c010349a69c3395f1a57c642dc62Ying Wang{ 69905436638acc7c010349a69c3395f1a57c642dc62Ying Wang char const *pkgdatadir = getenv ("BISON_PKGDATADIR"); 70005436638acc7c010349a69c3395f1a57c642dc62Ying Wang return pkgdatadir ? pkgdatadir : PKGDATADIR; 701cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 702