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