Files
bison/src/muscle_tab.c
Akim Demaille be2a1a68ef Give a try to M4 as a back end.
* lib/readpipe.c: New, from wdiff.
* src/Makefile.am (DEFS): Define PKGDATADIR, not BISON_SIMPLE and
BISON_HAIRY.
* src/system.h (BISON_HAIRY, BISON_SIMPLE): Remove the DOS and VMS
specific values.  Now it is m4 that performs the lookup.
* src/parse-skel.y: Remove.
* src/muscle_tab.c, src/muscle_tab.h (muscles_m4_output): New.
* src/output.c (actions_output, guards_output)
(token_definitions_output): No longer keeps track of the output
line number, hence remove the second argument.
(guards_output): Check against the guard member of a rule, not the
action member.
Adjust callers.
(output_skeleton): Don't look for the skeleton location, let m4 do
that.
Create `/tmp/muscles.m4'.  This is temporary, a proper temporary
file will be used.
Invoke `m4' on m4sugar.m4, muscles.m4, and the skeleton.
(prepare): Given that for the time being changesyntax is not
usable in M4, rename the muscles using `-' to `_'.
Define `defines_flag', `output_parser_name' and `output_header_name'.
* src/output.h (actions_output, guards_output)
(token_definitions_output): Adjust prototypes.
* src/scan-skel.l: Instead of scanning the skeletons, it now
processes the output of m4: `__oline__' and `#output'.
* data/bison.simple: Adjust to be used by M4(sugar).
* tests/Makefile.am: Use check_SCRIPTS to make sure `bison' is up
to date.
* tests/bison.in: Use the secrete envvar `BISON_PKGDATADIR'
instead of the dead `BISON_SIMPLE' and `BISON_HAIRY'.
* data/m4sugar/m4sugar.m4, data/m4sugar/version.m4: New,
shamelessly stolen from CVS Autoconf.
2002-02-05 10:08:59 +00:00

118 lines
3.0 KiB
C

/* Macro table manager for Bison,
Copyright (C) 2001, 2002 Free Software Foundation, Inc.
This file is part of Bison, the GNU Compiler Compiler.
Bison is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
Bison is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Bison; see the file COPYING. If not, write to
the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include "system.h"
#include "hash.h"
#include "files.h"
#include "muscle_tab.h"
#include "getargs.h"
/* Initial capacity of muscles hash table. */
#define HT_INITIAL_CAPACITY 257
struct hash_table *muscle_table = NULL;
static bool
hash_compare_muscles (void const *x, void const *y)
{
const muscle_entry_t *m1 = x;
const muscle_entry_t *m2 = y;
return strcmp (m1->key, m2->key) ? FALSE : TRUE;
}
static unsigned int
hash_muscle (const void *x, unsigned int tablesize)
{
const muscle_entry_t *m = x;
return hash_string (m->key, tablesize);
}
void
muscle_init (void)
{
muscle_table = hash_initialize (HT_INITIAL_CAPACITY, NULL, hash_muscle,
hash_compare_muscles, NULL);
/* Version and input file. */
muscle_insert ("version", VERSION);
muscle_insert ("filename", infile);
/* Types. */
muscle_insert ("stype", "int");
muscle_insert ("ltype", "yyltype");
/* Default #line formatting. */
muscle_insert ("linef", "#line %d %s\n");
/* Stack parameters. */
muscle_insert ("maxdepth", "10000");
muscle_insert ("initdepth", "200");
/* C++ macros. */
muscle_insert ("name", "Parser");
}
void
muscle_insert (const char *key, const char *value)
{
muscle_entry_t pair = { key, NULL };
muscle_entry_t *entry = hash_lookup (muscle_table, &pair);
if (!entry)
{
/* First insertion in the hash. */
entry = XMALLOC (muscle_entry_t, 1);
entry->key = key;
hash_insert (muscle_table, entry);
}
entry->value = value;
}
const char*
muscle_find (const char *key)
{
muscle_entry_t pair = { key, NULL };
muscle_entry_t *result = hash_lookup (muscle_table, &pair);
return result ? result->value : NULL;
}
/* Output the definition of all the current muscles into a list of
m4_defines. */
static void
muscle_m4_output (muscle_entry_t *entry, FILE *out)
{
fprintf (out, "m4_define([b4_%s],\n", entry->key);
fprintf (out, " [[%s]])\n\n\n", entry->value);
}
/* Output the definition of all the current muscles into a list of
m4_defines. */
void
muscles_m4_output (FILE *out)
{
hash_do_for_each (muscle_table,
(Hash_processor) muscle_m4_output,
out);
}