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:
Akim Demaille
2002-02-05 10:08:59 +00:00
parent 8e86444744
commit be2a1a68ef
13 changed files with 318 additions and 233 deletions

View File

@@ -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

View File

@@ -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);
}

View File

@@ -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_ */

View File

@@ -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);

View File

@@ -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;

View File

@@ -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;
%%

View File

@@ -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))