mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-11 21:33:04 +00:00
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.
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
## Copyright 2001 Free Software Foundation, Inc.
|
||||
## Copyright (C) 2001, 2002 Free Software Foundation, Inc.
|
||||
|
||||
## This program is free software; you can redistribute it and/or modify
|
||||
## it under the terms of the GNU General Public License as published by
|
||||
@@ -18,8 +18,7 @@
|
||||
AUTOMAKE_OPTIONS = ../lib/ansi2knr
|
||||
|
||||
DEFS = @DEFS@ \
|
||||
-DBISON_SIMPLE=\"$(pkgdatadir)/bison.simple\" \
|
||||
-DBISON_HAIRY=\"$(pkgdatadir)/bison.hairy\" \
|
||||
-DPKGDATADIR=\"$(pkgdatadir)\" \
|
||||
-DLOCALEDIR=\"$(datadir)/locale\"
|
||||
|
||||
CFLAGS = @CFLAGS@ $(WARNING_CFLAGS) $(WERROR_CFLAGS)
|
||||
@@ -45,9 +44,9 @@ bison_SOURCES = LR0.c closure.c complain.c conflicts.c \
|
||||
muscle_tab.h muscle_tab.c \
|
||||
options.h options.c \
|
||||
print.c reader.c reduce.c symtab.c warshall.c vcg.c \
|
||||
skeleton.h parse-skel.h parse-skel.y scan-skel.l
|
||||
scan-skel.l
|
||||
|
||||
BUILT_SOURCES = parse-skel.c scan-skel.c
|
||||
BUILT_SOURCES = scan-skel.c
|
||||
|
||||
EXTRA_bison_SOURCES = vmsgetargs.c
|
||||
|
||||
|
||||
@@ -92,3 +92,26 @@ muscle_find (const char *key)
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* Definitions for macrotab.c and callers, part of bison,
|
||||
Copyright 2001 Free Software Foundation, Inc.
|
||||
Copyright (C) 2001, 2002 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of Bison, the GNU Compiler Compiler.
|
||||
|
||||
@@ -55,4 +55,7 @@ const char *muscle_find PARAMS ((const char *key));
|
||||
muscle_insert (Key, obstack_finish (&muscle_obstack)); \
|
||||
}
|
||||
|
||||
|
||||
void muscles_m4_output PARAMS ((FILE *out));
|
||||
|
||||
#endif /* not MUSCLE_TAB_H_ */
|
||||
|
||||
109
src/output.c
109
src/output.c
@@ -90,6 +90,7 @@
|
||||
|
||||
#include "system.h"
|
||||
#include "quotearg.h"
|
||||
#include "error.h"
|
||||
#include "getargs.h"
|
||||
#include "files.h"
|
||||
#include "gram.h"
|
||||
@@ -101,7 +102,13 @@
|
||||
#include "symtab.h"
|
||||
#include "conflicts.h"
|
||||
#include "muscle_tab.h"
|
||||
#include "skeleton.h"
|
||||
|
||||
/* From lib/readpipe.h. */
|
||||
FILE *readpipe PARAMS ((const char *, ...));
|
||||
|
||||
/* From src/scan-skel.l. */
|
||||
int skel_lex PARAMS ((void));
|
||||
extern FILE *skel_in;
|
||||
|
||||
static int nvectors;
|
||||
static int nentries;
|
||||
@@ -504,7 +511,7 @@ token_actions (void)
|
||||
`-----------------------------*/
|
||||
|
||||
void
|
||||
actions_output (FILE *out, size_t *line)
|
||||
actions_output (FILE *out)
|
||||
{
|
||||
int rule;
|
||||
for (rule = 1; rule < nrules + 1; ++rule)
|
||||
@@ -523,14 +530,6 @@ actions_output (FILE *out, size_t *line)
|
||||
fprintf (out, "{ %s%s }\n break;\n\n",
|
||||
rules[rule].action,
|
||||
yacc_flag ? ";" : "");
|
||||
|
||||
/* We always output 4 '\n' per action. */
|
||||
*line += 4;
|
||||
/* Plus one if !no_lines_flag. */
|
||||
if (!no_lines_flag)
|
||||
++*line;
|
||||
/* Get the number of lines written by the user. */
|
||||
*line += get_lines_number (rules[rule].action);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -540,11 +539,11 @@ actions_output (FILE *out, size_t *line)
|
||||
`----------------------------*/
|
||||
|
||||
void
|
||||
guards_output (FILE *out, size_t *line)
|
||||
guards_output (FILE *out)
|
||||
{
|
||||
int rule;
|
||||
for (rule = 1; rule < nrules + 1; ++rule)
|
||||
if (rules[rule].action)
|
||||
if (rules[rule].guard)
|
||||
{
|
||||
fprintf (out, " case %d:\n", rule);
|
||||
|
||||
@@ -555,14 +554,6 @@ guards_output (FILE *out, size_t *line)
|
||||
muscle_find ("filename")));
|
||||
fprintf (out, "{ %s; }\n break;\n\n",
|
||||
rules[rule].guard);
|
||||
|
||||
/* We always output 4 '\n' per action. */
|
||||
*line += 4;
|
||||
/* Plus one if !no_lines_flag. */
|
||||
if (!no_lines_flag)
|
||||
++*line;
|
||||
/* Get the number of lines written by the user. */
|
||||
*line += get_lines_number (rules[rule].guard);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -572,7 +563,7 @@ guards_output (FILE *out, size_t *line)
|
||||
`---------------------------------------*/
|
||||
|
||||
void
|
||||
token_definitions_output (FILE *out, size_t *line)
|
||||
token_definitions_output (FILE *out)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < ntokens; ++i)
|
||||
@@ -603,14 +594,10 @@ token_definitions_output (FILE *out, size_t *line)
|
||||
|
||||
fprintf (out, "# define %s\t%d\n",
|
||||
symbol->tag, number);
|
||||
++*line;
|
||||
if (semantic_parser)
|
||||
{
|
||||
/* FIXME: This is probably wrong, and should be just as
|
||||
above. --akim. */
|
||||
fprintf (out, "# define T%s\t%d\n", symbol->tag, symbol->value);
|
||||
++*line;
|
||||
}
|
||||
/* FIXME: This is probably wrong, and should be just as
|
||||
above. --akim. */
|
||||
fprintf (out, "# define T%s\t%d\n", symbol->tag, symbol->value);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -972,14 +959,57 @@ output_skeleton (void)
|
||||
if (!skeleton)
|
||||
{
|
||||
if (semantic_parser)
|
||||
skeleton = skeleton_find ("BISON_HAIRY", BISON_HAIRY);
|
||||
skeleton = "bison.hairy";
|
||||
else
|
||||
skeleton = skeleton_find ("BISON_SIMPLE", BISON_SIMPLE);
|
||||
skeleton = "bison.simple";
|
||||
}
|
||||
|
||||
/* Parse the skeleton file and output the needed parsers. */
|
||||
muscle_insert ("skeleton", skeleton);
|
||||
process_skeleton (skeleton);
|
||||
|
||||
/* Store the definition of all the muscles. */
|
||||
{
|
||||
FILE *muscles_m4 = xfopen ("/tmp/muscles.m4", "w");
|
||||
/* There are no comments, especially not `#': we do want M4 expansion
|
||||
after `#': think of CPP macros! */
|
||||
fprintf (muscles_m4, "m4_changecom()\n");
|
||||
fprintf (muscles_m4, "m4_init()\n");
|
||||
|
||||
fprintf (muscles_m4, "m4_define([b4_actions], \n[[");
|
||||
actions_output (muscles_m4);
|
||||
fprintf (muscles_m4, "]])\n\n");
|
||||
|
||||
fprintf (muscles_m4, "m4_define([b4_guards], \n[[");
|
||||
guards_output (muscles_m4);
|
||||
fprintf (muscles_m4, "]])\n\n");
|
||||
|
||||
fprintf (muscles_m4, "m4_define([b4_tokendef], \n[[");
|
||||
token_definitions_output (muscles_m4);
|
||||
fprintf (muscles_m4, "]])\n\n");
|
||||
|
||||
muscles_m4_output (muscles_m4);
|
||||
|
||||
fprintf (muscles_m4, "m4_wrap([m4_divert_pop(0)])\n");
|
||||
fprintf (muscles_m4, "m4_divert_push(0)dnl\n");
|
||||
xfclose (muscles_m4);
|
||||
}
|
||||
|
||||
/* Invoke m4 on the definition of the muscles, and the skeleton. */
|
||||
{
|
||||
const char *bison_pkgdatadir = getenv ("BISON_PKGDATADIR");
|
||||
if (!bison_pkgdatadir)
|
||||
bison_pkgdatadir = PKGDATADIR;
|
||||
skel_in = readpipe ("m4",
|
||||
"-I",
|
||||
bison_pkgdatadir,
|
||||
"m4sugar/m4sugar.m4",
|
||||
"/tmp/muscles.m4",
|
||||
skeleton,
|
||||
NULL);
|
||||
if (!skel_in)
|
||||
error (EXIT_FAILURE, errno, "cannot run m4");
|
||||
skel_lex ();
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -992,20 +1022,23 @@ prepare (void)
|
||||
MUSCLE_INSERT_INT ("debug", debug_flag);
|
||||
MUSCLE_INSERT_INT ("final", final_state);
|
||||
MUSCLE_INSERT_INT ("maxtok", max_user_token_number);
|
||||
MUSCLE_INSERT_INT ("error-verbose", error_verbose);
|
||||
MUSCLE_INSERT_INT ("error_verbose", error_verbose);
|
||||
MUSCLE_INSERT_STRING ("prefix", spec_name_prefix ? spec_name_prefix : "yy");
|
||||
|
||||
/* FIXME: This is wrong: the muscles should decide whether they hold
|
||||
a copy or not, but the situation is too obscure currently. */
|
||||
MUSCLE_INSERT_STRING ("output-infix", output_infix ? output_infix : "");
|
||||
MUSCLE_INSERT_STRING ("output-prefix", short_base_name);
|
||||
MUSCLE_INSERT_STRING ("output_infix", output_infix ? output_infix : "");
|
||||
MUSCLE_INSERT_STRING ("output_prefix", short_base_name);
|
||||
MUSCLE_INSERT_STRING ("output_parser_name", parser_file_name);
|
||||
MUSCLE_INSERT_STRING ("output_header_name", spec_defines_file);
|
||||
|
||||
MUSCLE_INSERT_INT ("nnts", nvars);
|
||||
MUSCLE_INSERT_INT ("nrules", nrules);
|
||||
MUSCLE_INSERT_INT ("nstates", nstates);
|
||||
MUSCLE_INSERT_INT ("ntokens", ntokens);
|
||||
|
||||
MUSCLE_INSERT_INT ("locations-flag", locations_flag);
|
||||
MUSCLE_INSERT_INT ("locations_flag", locations_flag);
|
||||
MUSCLE_INSERT_INT ("defines_flag", defines_flag);
|
||||
}
|
||||
|
||||
/*-------------------------.
|
||||
@@ -1015,14 +1048,13 @@ prepare (void)
|
||||
static void
|
||||
header_output (void)
|
||||
{
|
||||
size_t dummy_line;
|
||||
FILE *out = xfopen (spec_defines_file, "w");
|
||||
char *macro_name = compute_header_macro ();
|
||||
|
||||
fprintf (out, "#ifndef %s\n", macro_name);
|
||||
fprintf (out, "# define %s\n\n", macro_name);
|
||||
|
||||
token_definitions_output (out, &dummy_line);
|
||||
token_definitions_output (out);
|
||||
fprintf (out, "\
|
||||
#ifndef YYSTYPE\n\
|
||||
typedef %s
|
||||
@@ -1097,7 +1129,8 @@ output (void)
|
||||
output_skeleton ();
|
||||
|
||||
/* Output the header if needed. */
|
||||
if (defines_flag)
|
||||
|
||||
if (0)
|
||||
header_output ();
|
||||
|
||||
free (rules + 1);
|
||||
|
||||
@@ -28,9 +28,9 @@ void output PARAMS ((void));
|
||||
|
||||
size_t get_lines_number PARAMS ((const char *s));
|
||||
|
||||
void actions_output PARAMS ((FILE *out, size_t *line));
|
||||
void guards_output PARAMS ((FILE *out, size_t *line));
|
||||
void token_definitions_output PARAMS ((FILE *out, size_t *line));
|
||||
void actions_output PARAMS ((FILE *out));
|
||||
void guards_output PARAMS ((FILE *out));
|
||||
void token_definitions_output PARAMS ((FILE *out));
|
||||
|
||||
extern struct obstack muscle_obstack;
|
||||
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
/* -*- C -*- */
|
||||
/* Scan Bison Skeletons.
|
||||
Copyright (C) 2001 Free Software Foundation, Inc.
|
||||
/* Scan Bison Skeletons. -*- C -*-
|
||||
Copyright (C) 2001, 2002 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of Bison, the GNU Compiler Compiler.
|
||||
|
||||
@@ -19,77 +18,26 @@
|
||||
Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
02111-1307, USA. */
|
||||
|
||||
%option debug nodefault noyywrap nounput
|
||||
%option nodefault noyywrap nounput
|
||||
%option prefix="skel_" outfile="lex.yy.c"
|
||||
|
||||
/* If we enable
|
||||
|
||||
%option yylineno
|
||||
|
||||
Then we have warning: `yy_flex_realloc' defined but not used.
|
||||
Seems like a Flex bug to me: Why the heck yylineno would trigger
|
||||
the REJECT exception??? */
|
||||
|
||||
%{
|
||||
#include "system.h"
|
||||
#include "skeleton.h"
|
||||
#include "parse-skel.h"
|
||||
%}
|
||||
|
||||
%{
|
||||
/* Each time we match a string, move the end cursor to its end. */
|
||||
#define YY_USER_ACTION yylloc->last_column += yyleng;
|
||||
#include "files.h"
|
||||
int skel_lex PARAMS ((void));
|
||||
static int yylineno = 1;
|
||||
%}
|
||||
%%
|
||||
%{
|
||||
/* At each yylex invocation, mark the current position as the
|
||||
start of the next token. */
|
||||
LOCATION_STEP (*yylloc);
|
||||
%}
|
||||
/* This is an approximation, but we don't need more. */
|
||||
^"#output \""[^\"]+\"\n {
|
||||
yytext[yyleng - 2] = '\0';
|
||||
skel_out = xfopen (yytext + strlen ("#output \""), "w");
|
||||
yylineno = 1;
|
||||
}
|
||||
|
||||
"%%{line}" { return LINE; }
|
||||
"%%{skeleton-line}" { return SLINE; }
|
||||
|
||||
"%%{section}" { return SECTION; }
|
||||
|
||||
"%%{guards}" { return GUARDS; }
|
||||
"%%{actions}" { return ACTIONS; }
|
||||
"%%{tokendef}" { return TOKENS; }
|
||||
|
||||
/* Muscle. */
|
||||
"%%{"[a-zA-Z][0-9a-zA-Z_-]+"}" {
|
||||
yylval->string = xstrndup (yytext + 3, yyleng - 4);
|
||||
return MUSCLE;
|
||||
}
|
||||
|
||||
/* String. */
|
||||
"%%\"".*"\"" {
|
||||
yylval->string = xstrndup (yytext + 3, yyleng - 4);
|
||||
return STRING;
|
||||
}
|
||||
|
||||
/* End of line. */
|
||||
"\n" {
|
||||
LOCATION_LINES (*yylloc, yyleng);
|
||||
return '\n';
|
||||
}
|
||||
|
||||
/* White spaces. */
|
||||
[\t ]+ {
|
||||
yylval->string = yytext;
|
||||
return BLANKS;
|
||||
}
|
||||
|
||||
/* Plain Characters. */
|
||||
[^%\n]+ {
|
||||
yylval->string = yytext;
|
||||
return RAW;
|
||||
}
|
||||
|
||||
/* Plain Character. */
|
||||
. {
|
||||
yylval->character = *yytext;
|
||||
return CHARACTER;
|
||||
}
|
||||
"__oline__" fprintf (yyout, "%d", yylineno);
|
||||
[^_\n]+ ECHO;
|
||||
\n+ yylineno += yyleng; ECHO;
|
||||
. ECHO;
|
||||
|
||||
%%
|
||||
|
||||
19
src/system.h
19
src/system.h
@@ -273,25 +273,6 @@ do { \
|
||||
# endif /* ! MSDOS */
|
||||
#endif /* ! VMS */
|
||||
|
||||
#if defined (VMS) & !defined (__VMS_POSIX)
|
||||
# ifndef BISON_SIMPLE
|
||||
# define BISON_SIMPLE "GNU_BISON:[000000]BISON.SIMPLE"
|
||||
# endif
|
||||
# ifndef BISON_HAIRY
|
||||
# define BISON_HARIRY "GNU_BISON:[000000]BISON.HAIRY"
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if defined (_MSC_VER)
|
||||
# ifndef BISON_SIMPLE
|
||||
# define BISON_SIMPLE "c:/usr/local/lib/bison.simple"
|
||||
# endif
|
||||
# ifndef BISON_HAIRY
|
||||
# define BISON_HAIRY "c:/usr/local/lib/bison.hairy"
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
||||
/* As memcpy, but for shorts. */
|
||||
#define shortcpy(Dest, Src, Num) \
|
||||
memcpy (Dest, Src, Num * sizeof (short))
|
||||
|
||||
Reference in New Issue
Block a user