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