mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-11 05:13:04 +00:00
Clean the error reporting functions.
* src/report.c: New file. * src/report.h: Likewise. * src/Makefile.am: Adjust. * m4/error.m4: New file. * m4/Makefile.am: Adjust. * configure.in (jm_PREREQ_ERROR): Call it. * src/main.c (int_to_string, banner, fatal_banner, warn_banner): Remove. (fatal, fatals): Remove. All callers use complain.c::fatal. (warn, warni, warns, warnss, warnss): Remove. All callers use complain.c::complain. (toomany): Remove, use fatal instead. * src/files.c (done): No argument, use complain_message_count. * src/main.c (main): Register `done' to `atexit'. * src/getargs.c (usage): More `fputs', less `fprintf'.
This commit is contained in:
@@ -28,6 +28,7 @@ Boston, MA 02111-1307, USA. */
|
||||
#include "alloc.h"
|
||||
#include "gram.h"
|
||||
#include "state.h"
|
||||
#include "complain.h"
|
||||
|
||||
|
||||
extern char *nullable;
|
||||
@@ -58,7 +59,6 @@ void insert_start_shift PARAMS((void));
|
||||
extern void initialize_closure PARAMS((int));
|
||||
extern void closure PARAMS((short *, int));
|
||||
extern void finalize_closure PARAMS((void));
|
||||
extern void toomany PARAMS((char *));
|
||||
|
||||
static core *this_state;
|
||||
static core *last_state;
|
||||
@@ -374,7 +374,7 @@ new_state (int symbol)
|
||||
#endif
|
||||
|
||||
if (nstates >= MAXSHORT)
|
||||
toomany("states");
|
||||
fatal (_("too many states (max %d)"), MAXSHORT);
|
||||
|
||||
isp1 = kernel_base[symbol];
|
||||
iend = kernel_end[symbol];
|
||||
|
||||
@@ -1,14 +1,6 @@
|
||||
## Process this file with automake to produce Makefile.in -*-Makefile-*-
|
||||
AUTOMAKE_OPTIONS = 1.4 ../lib/ansi2knr
|
||||
|
||||
bin_PROGRAMS = bison
|
||||
|
||||
bison_SOURCES = LR0.c allocate.c closure.c conflicts.c derives.c \
|
||||
files.c getargs.c gram.c lalr.c lex.c main.c nullable.c output.c \
|
||||
print.c reader.c reduce.c symtab.c warshall.c
|
||||
|
||||
EXTRA_bison_SOURCES = vmsgetargs.c
|
||||
|
||||
DEFS = @DEFS@ \
|
||||
-DXPFILE=\"${datadir}/bison.simple\" \
|
||||
-DXPFILE1=\"${datadir}/bison.hairy\" \
|
||||
@@ -16,7 +8,18 @@ DEFS = @DEFS@ \
|
||||
INCLUDES = -I../intl -I$(top_srcdir)/intl -I..
|
||||
LDADD = @INTLLIBS@ ../lib/libbison.a
|
||||
|
||||
noinst_HEADERS = alloc.h files.h gram.h lex.h machine.h state.h \
|
||||
bin_PROGRAMS = bison
|
||||
|
||||
bison_SOURCES = LR0.c allocate.c closure.c complain.c conflicts.c \
|
||||
derives.c \
|
||||
files.c getargs.c gram.c lalr.c lex.c main.c nullable.c \
|
||||
output.c \
|
||||
print.c reader.c reduce.c symtab.c warshall.c
|
||||
|
||||
EXTRA_bison_SOURCES = vmsgetargs.c
|
||||
|
||||
noinst_HEADERS = alloc.h complain.h files.h gram.h lex.h machine.h \
|
||||
state.h \
|
||||
symtab.h system.h types.h
|
||||
|
||||
data_DATA = bison.simple bison.hairy
|
||||
|
||||
269
src/complain.c
Normal file
269
src/complain.c
Normal file
@@ -0,0 +1,269 @@
|
||||
/* Declaration for error-reporting function for Bison.
|
||||
Copyright (C) 2000 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 the
|
||||
Free Software Foundation; either version 2, or (at your option) any
|
||||
later version.
|
||||
|
||||
This program 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 this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
USA. */
|
||||
|
||||
/* Based on error.c and error.h,
|
||||
written by David MacKenzie <djm@gnu.ai.mit.edu>. */
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
# include <config.h>
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#if HAVE_VPRINTF || HAVE_DOPRNT || _LIBC
|
||||
# if __STDC__
|
||||
# include <stdarg.h>
|
||||
# define VA_START(args, lastarg) va_start(args, lastarg)
|
||||
# else
|
||||
# include <varargs.h>
|
||||
# define VA_START(args, lastarg) va_start(args)
|
||||
# endif
|
||||
#else
|
||||
# define va_alist a1, a2, a3, a4, a5, a6, a7, a8
|
||||
# define va_dcl char *a1, *a2, *a3, *a4, *a5, *a6, *a7, *a8;
|
||||
#endif
|
||||
|
||||
#if STDC_HEADERS || _LIBC
|
||||
# include <stdlib.h>
|
||||
# include <string.h>
|
||||
#else
|
||||
void exit ();
|
||||
#endif
|
||||
|
||||
#include "complain.h"
|
||||
|
||||
#ifndef _
|
||||
# define _(String) String
|
||||
#endif
|
||||
|
||||
#ifdef _LIBC
|
||||
/* In the GNU C library, there is a predefined variable for this. */
|
||||
# define program_name program_invocation_name
|
||||
#else /* not _LIBC */
|
||||
/* The calling program should define program_name and set it to the
|
||||
name of the executing program. */
|
||||
extern char *program_name;
|
||||
#endif
|
||||
|
||||
/* This variable is incremented each time `warn' is called. */
|
||||
unsigned int warn_message_count;
|
||||
|
||||
/* This variable is incremented each time `complain' is called. */
|
||||
unsigned int complain_message_count;
|
||||
|
||||
/* Sometimes we want to have at most one error per line. This
|
||||
variable controls whether this mode is selected or not. */
|
||||
int error_one_per_line;
|
||||
|
||||
/*--------------------------------.
|
||||
| Report a warning, and proceed. |
|
||||
`--------------------------------*/
|
||||
|
||||
void
|
||||
#if defined VA_START && __STDC__
|
||||
warn (const char *message, ...)
|
||||
#else
|
||||
warn (message, va_alist)
|
||||
char *message;
|
||||
va_dcl
|
||||
#endif
|
||||
{
|
||||
#ifdef VA_START
|
||||
va_list args;
|
||||
#endif
|
||||
|
||||
if (error_one_per_line)
|
||||
{
|
||||
static const char *old_infile;
|
||||
static unsigned int old_lineno;
|
||||
|
||||
if (old_lineno == lineno &&
|
||||
(infile == old_infile || !strcmp (old_infile, infile)))
|
||||
/* Simply return and print nothing. */
|
||||
return;
|
||||
|
||||
old_infile = infile;
|
||||
old_lineno = lineno;
|
||||
}
|
||||
|
||||
fflush (stdout);
|
||||
if (infile != NULL)
|
||||
fprintf (stderr, "%s:%d: ", infile, lineno);
|
||||
else
|
||||
fprintf (stderr, "%s:", program_name);
|
||||
|
||||
fputs (_("warning: "), stderr);
|
||||
|
||||
#ifdef VA_START
|
||||
VA_START (args, message);
|
||||
vfprintf (stderr, message, args);
|
||||
va_end (args);
|
||||
#else
|
||||
fprintf (stderr, message, a1, a2, a3, a4, a5, a6, a7, a8);
|
||||
#endif
|
||||
|
||||
++warn_message_count;
|
||||
putc ('\n', stderr);
|
||||
fflush (stderr);
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------------.
|
||||
| An error has occurred, but we can proceed, and die later. |
|
||||
`-----------------------------------------------------------*/
|
||||
|
||||
void
|
||||
#if defined VA_START && __STDC__
|
||||
complain (const char *message, ...)
|
||||
#else
|
||||
complain (message, va_alist)
|
||||
char *message;
|
||||
va_dcl
|
||||
#endif
|
||||
{
|
||||
#ifdef VA_START
|
||||
va_list args;
|
||||
#endif
|
||||
|
||||
if (error_one_per_line)
|
||||
{
|
||||
static const char *old_infile;
|
||||
static unsigned int old_lineno;
|
||||
|
||||
if (old_lineno == lineno &&
|
||||
(infile == old_infile || !strcmp (old_infile, infile)))
|
||||
/* Simply return and print nothing. */
|
||||
return;
|
||||
|
||||
old_infile = infile;
|
||||
old_lineno = lineno;
|
||||
}
|
||||
|
||||
fflush (stdout);
|
||||
if (infile != NULL)
|
||||
fprintf (stderr, "%s:%d: ", infile, lineno);
|
||||
else
|
||||
fprintf (stderr, "%s:", program_name);
|
||||
|
||||
#ifdef VA_START
|
||||
VA_START (args, message);
|
||||
vfprintf (stderr, message, args);
|
||||
va_end (args);
|
||||
#else
|
||||
fprintf (stderr, message, a1, a2, a3, a4, a5, a6, a7, a8);
|
||||
#endif
|
||||
|
||||
++complain_message_count;
|
||||
putc ('\n', stderr);
|
||||
fflush (stderr);
|
||||
}
|
||||
|
||||
/*-------------------------------------------------.
|
||||
| A severe error has occurred, we cannot proceed. |
|
||||
`-------------------------------------------------*/
|
||||
|
||||
void
|
||||
#if defined VA_START && __STDC__
|
||||
fatal (const char *message, ...)
|
||||
#else
|
||||
fatal (message, va_alist)
|
||||
char *message;
|
||||
va_dcl
|
||||
#endif
|
||||
{
|
||||
#ifdef VA_START
|
||||
va_list args;
|
||||
#endif
|
||||
|
||||
fflush (stdout);
|
||||
if (infile != NULL)
|
||||
fprintf (stderr, "%s:%d: ", infile, lineno);
|
||||
else
|
||||
fprintf (stderr, "%s:", program_name);
|
||||
|
||||
fputs (_("fatal error: "), stderr);
|
||||
|
||||
#ifdef VA_START
|
||||
VA_START (args, message);
|
||||
vfprintf (stderr, message, args);
|
||||
va_end (args);
|
||||
#else
|
||||
fprintf (stderr, message, a1, a2, a3, a4, a5, a6, a7, a8);
|
||||
#endif
|
||||
putc ('\n', stderr);
|
||||
fflush (stderr);
|
||||
exit (1);
|
||||
}
|
||||
|
||||
/*------------------------------------------------------------------.
|
||||
| A severe error has occurred, we cannot proceed. Exit with STATUS, |
|
||||
| and report the error message of the errno ERRNUM. |
|
||||
`------------------------------------------------------------------*/
|
||||
|
||||
void
|
||||
#if defined VA_START && __STDC__
|
||||
error (int status, int errnum,
|
||||
const char *message, ...)
|
||||
#else
|
||||
error (status, errnum, message, va_alist)
|
||||
int status;
|
||||
int errnum;
|
||||
char *message;
|
||||
va_dcl
|
||||
#endif
|
||||
{
|
||||
#ifdef VA_START
|
||||
va_list args;
|
||||
#endif
|
||||
|
||||
fflush (stdout);
|
||||
if (infile != NULL)
|
||||
fprintf (stderr, "%s:%d: ", infile, lineno);
|
||||
else
|
||||
fprintf (stderr, "%s:", program_name);
|
||||
|
||||
fputs (_("fatal error: "), stderr);
|
||||
|
||||
#ifdef VA_START
|
||||
VA_START (args, message);
|
||||
vfprintf (stderr, message, args);
|
||||
va_end (args);
|
||||
#else
|
||||
fprintf (stderr, message, a1, a2, a3, a4, a5, a6, a7, a8);
|
||||
#endif
|
||||
|
||||
if (errnum)
|
||||
{
|
||||
#if defined HAVE_STRERROR_R || _LIBC
|
||||
char errbuf[1024];
|
||||
# if HAVE_WORKING_STRERROR_R || _LIBC
|
||||
fprintf (stderr, ": %s", __strerror_r (errnum, errbuf, sizeof errbuf));
|
||||
# else
|
||||
/* Don't use __strerror_r's return value because on some systems
|
||||
(at least DEC UNIX 4.0[A-D]) strerror_r returns `int'. */
|
||||
__strerror_r (errnum, errbuf, sizeof errbuf);
|
||||
fprintf (stderr, ": %s", errbuf);
|
||||
# endif
|
||||
#else
|
||||
fprintf (stderr, ": %s", strerror (errnum));
|
||||
#endif
|
||||
}
|
||||
putc ('\n', stderr);
|
||||
fflush (stderr);
|
||||
if (status)
|
||||
exit (status);
|
||||
}
|
||||
75
src/complain.h
Normal file
75
src/complain.h
Normal file
@@ -0,0 +1,75 @@
|
||||
/* Declaration for error-reporting function for Bison.
|
||||
Copyright (C) 2000 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 the
|
||||
Free Software Foundation; either version 2, or (at your option) any
|
||||
later version.
|
||||
|
||||
This program 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 this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
USA. */
|
||||
|
||||
#ifndef COMPLAIN_H_
|
||||
#define COMPLAIN_H_ 1
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#if defined (__STDC__) && __STDC__
|
||||
|
||||
/* Informative messages, but we proceed. */
|
||||
|
||||
extern void warn (const char *format, ...)
|
||||
__attribute__ ((__format__ (__printf__, 1, 2)));
|
||||
|
||||
/* Something bad happen, but let's continue and die later. */
|
||||
|
||||
extern void complain (const char *format, ...)
|
||||
__attribute__ ((__format__ (__printf__, 1, 2)));
|
||||
|
||||
/* Something bad happen and we die now. */
|
||||
|
||||
extern void fatal (const char *format, ...)
|
||||
__attribute__ ((__format__ (__printf__, 1, 2)));
|
||||
|
||||
/* Print a message with `fprintf (stderr, FORMAT, ...)';
|
||||
if ERRNUM is nonzero, follow it with ": " and strerror (ERRNUM).
|
||||
If STATUS is nonzero, terminate the program with `exit (STATUS)'. */
|
||||
|
||||
extern void error (int status, int errnum,
|
||||
const char *format, ...)
|
||||
__attribute__ ((__format__ (__printf__, 3, 4)));
|
||||
|
||||
#else
|
||||
void warn ();
|
||||
void complain ();
|
||||
void error ();
|
||||
#endif
|
||||
|
||||
/* Position in the current input file. */
|
||||
extern char *infile;
|
||||
extern int lineno;
|
||||
|
||||
/* This variable is incremented each time `warn' is called. */
|
||||
extern unsigned int warn_message_count;
|
||||
|
||||
/* This variable is incremented each time `complain' is called. */
|
||||
extern unsigned int complain_message_count;
|
||||
|
||||
/* Sometimes we want to have at most one error per line. This
|
||||
variable controls whether this mode is selected or not. */
|
||||
extern int error_one_per_line;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* !COMPLAIN_H_ */
|
||||
46
src/files.c
46
src/files.c
@@ -50,6 +50,7 @@ Boston, MA 02111-1307, USA. */
|
||||
#include "files.h"
|
||||
#include "alloc.h"
|
||||
#include "gram.h"
|
||||
#include "complain.h"
|
||||
|
||||
FILE *finput = NULL;
|
||||
FILE *foutput = NULL;
|
||||
@@ -78,14 +79,12 @@ extern int noparserflag;
|
||||
|
||||
extern char *mktemp(); /* So the compiler won't complain */
|
||||
extern char *getenv();
|
||||
extern void perror();
|
||||
|
||||
char *stringappend PARAMS((char *, int, char *));
|
||||
void openfiles PARAMS((void));
|
||||
void open_extra_files PARAMS((void));
|
||||
FILE *tryopen PARAMS((char *, char *)); /* This might be a good idea */
|
||||
int tryclose PARAMS((FILE *));
|
||||
void done PARAMS((int));
|
||||
|
||||
extern char *program_name;
|
||||
extern int verboseflag;
|
||||
@@ -231,7 +230,7 @@ openfiles (void)
|
||||
|
||||
finput = tryopen(infile, "r");
|
||||
|
||||
if (! noparserflag)
|
||||
if (! noparserflag)
|
||||
{
|
||||
filename = getenv("BISON_SIMPLE");
|
||||
#ifdef MSDOS
|
||||
@@ -266,7 +265,7 @@ openfiles (void)
|
||||
/* use permanent name for actions file */
|
||||
actfile = stringappend(name_base, short_base_length, ".act");
|
||||
faction = tryopen(actfile, "w");
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef MSDOS
|
||||
if (! noparserflag)
|
||||
@@ -338,7 +337,7 @@ open_extra_files (void)
|
||||
|
||||
tryclose(fparser);
|
||||
|
||||
if (! noparserflag)
|
||||
if (! noparserflag)
|
||||
{
|
||||
filename = (char *) getenv ("BISON_HAIRY");
|
||||
#ifdef MSDOS
|
||||
@@ -368,20 +367,17 @@ open_extra_files (void)
|
||||
|
||||
}
|
||||
|
||||
/* JF to make file opening easier. This func tries to open file
|
||||
NAME with mode MODE, and prints an error message if it fails. */
|
||||
/* JF to make file opening easier. This func tries to open file
|
||||
NAME with mode MODE, and prints an error message if it fails. */
|
||||
FILE *
|
||||
tryopen (char *name, char *mode)
|
||||
{
|
||||
FILE *ptr;
|
||||
|
||||
ptr = fopen(name, mode);
|
||||
if (ptr == NULL)
|
||||
{
|
||||
fprintf(stderr, "%s: ", program_name);
|
||||
perror(name);
|
||||
done(2);
|
||||
}
|
||||
ptr = fopen (name, mode);
|
||||
if (!ptr)
|
||||
error (2, errno, _("cannot open file `%s'"), name);
|
||||
|
||||
return ptr;
|
||||
}
|
||||
|
||||
@@ -395,16 +391,13 @@ tryclose (FILE *ptr)
|
||||
|
||||
result = fclose (ptr);
|
||||
if (result == EOF)
|
||||
{
|
||||
fprintf (stderr, "%s: ", program_name);
|
||||
perror ("fclose");
|
||||
done (2);
|
||||
}
|
||||
error (2, errno, _("cannot close file"));
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
void
|
||||
done (int k)
|
||||
done (void)
|
||||
{
|
||||
tryclose(faction);
|
||||
tryclose(fattrs);
|
||||
@@ -413,8 +406,8 @@ done (int k)
|
||||
tryclose(fparser);
|
||||
tryclose(foutput);
|
||||
|
||||
/* JF write out the output file */
|
||||
if (k == 0 && ftable)
|
||||
/* JF write out the output file */
|
||||
if (!complain_message_count && ftable)
|
||||
{
|
||||
FILE *ftmp;
|
||||
register int c;
|
||||
@@ -445,8 +438,10 @@ done (int k)
|
||||
delete(tmpattrsfile);
|
||||
if (ftable)
|
||||
delete(tmptabfile);
|
||||
if (k==0) sys$exit(SS$_NORMAL);
|
||||
sys$exit(SS$_ABORT);
|
||||
/* Don't call exit again, we're in atexit ().
|
||||
if (!complain_message_count)
|
||||
sys$exit(SS$_NORMAL);
|
||||
sys$exit(SS$_ABORT); */
|
||||
#else
|
||||
#if (defined (MSDOS) || (defined(_WIN32) && !defined(__CYGWIN32__)))
|
||||
if (actfile && ! noparserflag) unlink(actfile);
|
||||
@@ -454,6 +449,7 @@ done (int k)
|
||||
if (tmptabfile) unlink(tmptabfile);
|
||||
if (tmpdefsfile) unlink(tmpdefsfile);
|
||||
#endif /* MSDOS || (_WIN32 && !__CYGWIN32__) */
|
||||
exit(k);
|
||||
/* Don't call exit again, we're in atexit ().
|
||||
exit (complain_message_count ? 1 : 0); */
|
||||
#endif /* not VMS, or __VMS_POSIX */
|
||||
}
|
||||
|
||||
31
src/files.h
31
src/files.h
@@ -1,22 +1,22 @@
|
||||
/* File names and variables for bison,
|
||||
Copyright (C) 1984, 1989 Free Software Foundation, Inc.
|
||||
Copyright (C) 1984, 1989, 2000 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of Bison, the GNU Compiler Compiler.
|
||||
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 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.
|
||||
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. */
|
||||
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. */
|
||||
|
||||
|
||||
/* These two should be pathnames for opening the sample parser files.
|
||||
@@ -45,9 +45,12 @@ extern char *spec_name_prefix; /* for -a, from getargs.c */
|
||||
extern char *spec_file_prefix;
|
||||
|
||||
extern char *infile;
|
||||
extern int lineno;
|
||||
extern char *outfile;
|
||||
extern char *defsfile;
|
||||
extern char *tabfile;
|
||||
extern char *attrsfile;
|
||||
extern char *guardfile;
|
||||
extern char *actfile;
|
||||
|
||||
void done PARAMS((void));
|
||||
|
||||
@@ -66,8 +66,8 @@ usage (FILE *stream)
|
||||
{
|
||||
/* Some efforts were made to ease the translators' task, please
|
||||
continue. */
|
||||
fprintf (stream, _("\
|
||||
GNU bison generates parsers for LALR(1) grammars.\n"));
|
||||
fputs (_("\
|
||||
GNU bison generates parsers for LALR(1) grammars.\n"), stream);
|
||||
putc ('\n', stream);
|
||||
|
||||
fprintf (stream, _("\
|
||||
@@ -80,14 +80,14 @@ for the equivalent short option also. Similarly for optional arguments.\n"),
|
||||
stream);
|
||||
putc ('\n', stream);
|
||||
|
||||
fprintf (stream, _("\
|
||||
fputs (_("\
|
||||
Operation modes:\n\
|
||||
-h, --help display this help and exit\n\
|
||||
-V, --version output version information and exit\n\
|
||||
-y, --yacc emulate POSIX yacc\n"));
|
||||
-y, --yacc emulate POSIX yacc\n"), stream);
|
||||
putc ('\n', stream);
|
||||
|
||||
fprintf (stream, _("\
|
||||
fputs (_("\
|
||||
Parser:\n\
|
||||
-t, --debug instrument the parser for debugging\n\
|
||||
-p, --name-prefix=PREFIX prepend PREFIX to the external symbols\n\
|
||||
@@ -95,20 +95,19 @@ Parser:\n\
|
||||
-n, --no-parser generate the tables only\n\
|
||||
-r, --raw number the tokens from 3\n\
|
||||
-k, --token-table include a table of token names\n\
|
||||
"));
|
||||
"), stream);
|
||||
putc ('\n', stream);
|
||||
|
||||
fprintf (stream, _("\
|
||||
fputs (_("\
|
||||
Output:\n\
|
||||
-d, --defines also produce a header file\n\
|
||||
-v, --verbose also produce an explanation of the automaton\n\
|
||||
-b, --file-prefix=PREFIX specify a PREFIX for output files\n\
|
||||
-o, --output-file=FILE leave output to FILE\n"));
|
||||
-o, --output-file=FILE leave output to FILE\n"), stream);
|
||||
putc ('\n', stream);
|
||||
|
||||
fprintf (stream, _("\
|
||||
Report bugs to <bug-bison@gnu.org>.\n"),
|
||||
program_name);
|
||||
fputs (_("\
|
||||
Report bugs to <bug-bison@gnu.org>.\n"), stream);
|
||||
}
|
||||
|
||||
void
|
||||
|
||||
11
src/lalr.c
11
src/lalr.c
@@ -24,7 +24,7 @@ Boston, MA 02111-1307, USA. */
|
||||
|
||||
lalr(), the entry point, builds these data structures:
|
||||
|
||||
goto_map, from_state and to_state
|
||||
goto_map, from_state and to_state
|
||||
record each shift transition which accepts a variable (a nonterminal).
|
||||
ngotos is the number of such transitions.
|
||||
from_state[t] is the state number which a transition leads from
|
||||
@@ -39,7 +39,7 @@ The elements of LAruleno that apply to state s are those from
|
||||
lookaheads[s] through lookaheads[s+1]-1.
|
||||
Each element of LAruleno is a rule number.
|
||||
|
||||
If lr is the length of LAruleno, then a number from 0 to lr-1
|
||||
If lr is the length of LAruleno, then a number from 0 to lr-1
|
||||
can specify both a rule and a state where the rule might be applied.
|
||||
|
||||
LA is a lr by ntokens matrix of bits.
|
||||
@@ -55,7 +55,7 @@ If LA[l, i] and LA[l, j] are both 1 for i != j, it is a conflict.
|
||||
#include "state.h"
|
||||
#include "alloc.h"
|
||||
#include "gram.h"
|
||||
|
||||
#include "complain.h"
|
||||
|
||||
extern short **derives;
|
||||
extern char *nullable;
|
||||
@@ -92,7 +92,6 @@ void compute_lookaheads PARAMS((void));
|
||||
void digraph PARAMS((short **));
|
||||
void traverse PARAMS((register int));
|
||||
|
||||
extern void toomany PARAMS((char *));
|
||||
extern void berror PARAMS((char *));
|
||||
|
||||
static int infinity;
|
||||
@@ -291,7 +290,7 @@ set_goto_map (void)
|
||||
if (ISTOKEN(symbol)) break;
|
||||
|
||||
if (ngotos == MAXSHORT)
|
||||
toomany(_("gotos"));
|
||||
fatal (_("too many gotos (max %d)"), MAXSHORT);
|
||||
|
||||
ngotos++;
|
||||
goto_map[symbol]++;
|
||||
@@ -413,7 +412,7 @@ initialize_F (void)
|
||||
if (nullable[symbol])
|
||||
edge[nedges++] = map_goto(stateno, symbol);
|
||||
}
|
||||
|
||||
|
||||
if (nedges)
|
||||
{
|
||||
reads[i] = rp = NEW2(nedges + 1, short);
|
||||
|
||||
58
src/lex.c
58
src/lex.c
@@ -1,22 +1,22 @@
|
||||
/* Token-reader for Bison's input parser,
|
||||
Copyright (C) 1984, 1986, 1989, 1992 Free Software Foundation, Inc.
|
||||
Copyright (C) 1984, 1986, 1989, 1992, 2000 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of Bison, the GNU Compiler Compiler.
|
||||
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 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.
|
||||
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. */
|
||||
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. */
|
||||
|
||||
|
||||
/*
|
||||
@@ -33,6 +33,7 @@ Boston, MA 02111-1307, USA. */
|
||||
#include "symtab.h"
|
||||
#include "lex.h"
|
||||
#include "alloc.h"
|
||||
#include "complain.h"
|
||||
|
||||
/* flags set by % directives */
|
||||
extern int definesflag; /* for -d */
|
||||
@@ -47,7 +48,6 @@ extern char *spec_name_prefix; /* for -p */
|
||||
extern char *spec_file_prefix; /* for -b */
|
||||
/*spec_outfile is declared in files.h, for -o */
|
||||
|
||||
extern int lineno;
|
||||
extern int translations;
|
||||
|
||||
void init_lex PARAMS((void));
|
||||
@@ -61,10 +61,6 @@ int parse_percent_token PARAMS((void));
|
||||
|
||||
/* functions from main.c */
|
||||
extern char *printable_version PARAMS((int));
|
||||
extern void fatal PARAMS((char *));
|
||||
extern void warn PARAMS((char *));
|
||||
extern void warni PARAMS((char *, int));
|
||||
extern void warns PARAMS((char *, char *));
|
||||
|
||||
/* Buffer for storing the current token. */
|
||||
char *token_buffer;
|
||||
@@ -116,7 +112,7 @@ skip_white_space (void)
|
||||
c = getc(finput);
|
||||
if (c != '*' && c != '/')
|
||||
{
|
||||
warn(_("unexpected `/' found and ignored"));
|
||||
complain (_("unexpected `/' found and ignored"));
|
||||
break;
|
||||
}
|
||||
cplus_comment = (c == '/');
|
||||
@@ -145,7 +141,7 @@ skip_white_space (void)
|
||||
c = getc(finput);
|
||||
}
|
||||
else if (c == EOF)
|
||||
fatal(_("unterminated comment"));
|
||||
fatal (_("unterminated comment"));
|
||||
else
|
||||
c = getc(finput);
|
||||
}
|
||||
@@ -173,7 +169,7 @@ safegetc (FILE *f)
|
||||
{
|
||||
register int c = getc(f);
|
||||
if (c == EOF)
|
||||
fatal(_("Unexpected end of file"));
|
||||
fatal (_("unexpected end of file"));
|
||||
return c;
|
||||
}
|
||||
|
||||
@@ -194,7 +190,7 @@ literalchar (char **pp, int *pcode, char term)
|
||||
c = safegetc(finput);
|
||||
if (c == '\n')
|
||||
{
|
||||
warn(_("unescaped newline in constant"));
|
||||
complain (_("unescaped newline in constant"));
|
||||
ungetc(c, finput);
|
||||
code = '?';
|
||||
wasquote = 1;
|
||||
@@ -226,7 +222,8 @@ literalchar (char **pp, int *pcode, char term)
|
||||
code = (code * 8) + (c - '0');
|
||||
if (code >= 256 || code < 0)
|
||||
{
|
||||
warni(_("octal value outside range 0...255: `\\%o'"), code);
|
||||
complain (_("octal value outside range 0...255: `\\%o'"),
|
||||
code);
|
||||
code &= 0xFF;
|
||||
break;
|
||||
}
|
||||
@@ -250,7 +247,8 @@ literalchar (char **pp, int *pcode, char term)
|
||||
break;
|
||||
if (code >= 256 || code<0)
|
||||
{
|
||||
warni(_("hexadecimal value above 255: `\\x%x'"), code);
|
||||
complain (_("hexadecimal value above 255: `\\x%x'"),
|
||||
code);
|
||||
code &= 0xFF;
|
||||
break;
|
||||
}
|
||||
@@ -260,8 +258,8 @@ literalchar (char **pp, int *pcode, char term)
|
||||
}
|
||||
else
|
||||
{
|
||||
warns (_("unknown escape sequence: `\\' followed by `%s'"),
|
||||
printable_version(c));
|
||||
complain (_("unknown escape sequence: `\\' followed by `%s'"),
|
||||
printable_version(c));
|
||||
code = '?';
|
||||
}
|
||||
} /* has \ */
|
||||
@@ -393,7 +391,7 @@ lex (void)
|
||||
c = getc(finput);
|
||||
if (c != '\'')
|
||||
{
|
||||
warn(_("use \"...\" for multi-character literal tokens"));
|
||||
complain (_("use \"...\" for multi-character literal tokens"));
|
||||
while (1)
|
||||
{
|
||||
dp = discard;
|
||||
@@ -472,10 +470,10 @@ lex (void)
|
||||
while (c != '>')
|
||||
{
|
||||
if (c == EOF)
|
||||
fatal(_("unterminated type name at end of file"));
|
||||
fatal (_("unterminated type name at end of file"));
|
||||
if (c == '\n')
|
||||
{
|
||||
warn(_("unterminated type name"));
|
||||
complain (_("unterminated type name"));
|
||||
ungetc(c, finput);
|
||||
break;
|
||||
}
|
||||
|
||||
157
src/main.c
157
src/main.c
@@ -22,10 +22,10 @@
|
||||
#include <stdio.h>
|
||||
#include "system.h"
|
||||
#include "machine.h" /* for MAXSHORT */
|
||||
#include "files.h"
|
||||
#include "complain.h"
|
||||
|
||||
extern int lineno;
|
||||
extern int verboseflag;
|
||||
extern char *infile;
|
||||
|
||||
/* Nonzero means failure has been detected; don't write a parser file. */
|
||||
int failure;
|
||||
@@ -34,14 +34,6 @@ int failure;
|
||||
char *program_name;
|
||||
|
||||
char *printable_version PARAMS((int));
|
||||
char *int_to_string PARAMS((int));
|
||||
void fatal PARAMS((char *));
|
||||
void fatals PARAMS((char *, char *));
|
||||
void warn PARAMS((char *));
|
||||
void warni PARAMS((char *, int));
|
||||
void warns PARAMS((char *, char *));
|
||||
void warnss PARAMS((char *, char *, char *));
|
||||
void warnsss PARAMS((char *, char *, char *, char *));
|
||||
void toomany PARAMS((char *));
|
||||
void berror PARAMS((char *));
|
||||
|
||||
@@ -57,7 +49,6 @@ extern void initialize_conflicts PARAMS((void));
|
||||
extern void verbose PARAMS((void));
|
||||
extern void terse PARAMS((void));
|
||||
extern void output PARAMS((void));
|
||||
extern void done PARAMS((int));
|
||||
|
||||
|
||||
/* VMS complained about using `int'. */
|
||||
@@ -70,17 +61,20 @@ main (int argc, char *argv[])
|
||||
bindtextdomain (PACKAGE, LOCALEDIR);
|
||||
textdomain (PACKAGE);
|
||||
|
||||
failure = 0;
|
||||
lineno = 0;
|
||||
getargs(argc, argv);
|
||||
|
||||
/* Be ready to clean up if we exit.*/
|
||||
atexit (done);
|
||||
|
||||
openfiles();
|
||||
|
||||
/* read the input. Copy some parts of it to fguard, faction, ftable and fattrs.
|
||||
In file reader.c.
|
||||
The other parts are recorded in the grammar; see gram.h. */
|
||||
reader();
|
||||
if (failure)
|
||||
done(failure);
|
||||
reader ();
|
||||
if (complain_message_count)
|
||||
exit (1);
|
||||
|
||||
/* find useless nonterminals and productions and reduce the grammar. In
|
||||
file reduce.c */
|
||||
@@ -110,8 +104,9 @@ main (int argc, char *argv[])
|
||||
|
||||
/* output the tables and the parser to ftable. In file output. */
|
||||
output();
|
||||
done(failure);
|
||||
return failure;
|
||||
done ();
|
||||
|
||||
exit (complain_message_count ? 1 : 0);
|
||||
}
|
||||
|
||||
/* functions to report errors which prevent a parser from being generated */
|
||||
@@ -134,137 +129,11 @@ printable_version (int c)
|
||||
return buf;
|
||||
}
|
||||
|
||||
/* Generate a string from the integer I.
|
||||
Return a ptr to internal memory containing the string. */
|
||||
|
||||
char *
|
||||
int_to_string (int i)
|
||||
{
|
||||
static char buf[20];
|
||||
sprintf(buf, "%d", i);
|
||||
return buf;
|
||||
}
|
||||
|
||||
/* Display filename and lino if available. */
|
||||
|
||||
static void
|
||||
banner (void)
|
||||
{
|
||||
if (infile == 0)
|
||||
fprintf(stderr, "%s: ", program_name);
|
||||
else
|
||||
fprintf(stderr, "%s:%d: ", infile, lineno);
|
||||
}
|
||||
|
||||
static void
|
||||
fatal_banner (void)
|
||||
{
|
||||
banner ();
|
||||
fputs (_("fatal error: "), stderr);
|
||||
}
|
||||
|
||||
/* Print the message S for a fatal error. */
|
||||
|
||||
void
|
||||
fatal (char *s)
|
||||
{
|
||||
fatal_banner ();
|
||||
fputs (s, stderr);
|
||||
fputc ('\n', stderr);
|
||||
done (1);
|
||||
}
|
||||
|
||||
|
||||
/* Print a message for a fatal error. Use FMT to construct the message
|
||||
and incorporate string X1. */
|
||||
|
||||
void
|
||||
fatals (char *fmt, char *x1)
|
||||
{
|
||||
fatal_banner ();
|
||||
fprintf (stderr, fmt, x1);
|
||||
fputc ('\n', stderr);
|
||||
done (1);
|
||||
}
|
||||
|
||||
static void
|
||||
warn_banner (void)
|
||||
{
|
||||
banner ();
|
||||
failure = 1;
|
||||
}
|
||||
|
||||
/* Print a warning message S. */
|
||||
|
||||
void
|
||||
warn (char *s)
|
||||
{
|
||||
warn_banner ();
|
||||
fputs (s, stderr);
|
||||
fputc ('\n', stderr);
|
||||
}
|
||||
|
||||
/* Print a warning message containing the string for the integer X1.
|
||||
The message is given by the format FMT. */
|
||||
|
||||
void
|
||||
warni (char *fmt, int x1)
|
||||
{
|
||||
warn_banner ();
|
||||
fprintf (stderr, fmt, x1);
|
||||
fputc ('\n', stderr);
|
||||
}
|
||||
|
||||
/* Print a warning message containing the string X1.
|
||||
The message is given by the format FMT. */
|
||||
|
||||
void
|
||||
warns (char *fmt, char *x1)
|
||||
{
|
||||
warn_banner ();
|
||||
fprintf (stderr, fmt, x1);
|
||||
fputc ('\n', stderr);
|
||||
}
|
||||
|
||||
/* Print a warning message containing the two strings X1 and X2.
|
||||
The message is given by the format FMT. */
|
||||
|
||||
void
|
||||
warnss (char *fmt, char *x1, char *x2)
|
||||
{
|
||||
warn_banner ();
|
||||
fprintf (stderr, fmt, x1, x2);
|
||||
fputc ('\n', stderr);
|
||||
}
|
||||
|
||||
/* Print a warning message containing the 3 strings X1, X2, X3.
|
||||
The message is given by the format FMT. */
|
||||
|
||||
void
|
||||
warnsss (char *fmt, char *x1, char *x2, char *x3)
|
||||
{
|
||||
warn_banner ();
|
||||
fprintf (stderr, fmt, x1, x2, x3);
|
||||
fputc ('\n', stderr);
|
||||
}
|
||||
|
||||
/* Print a message for the fatal occurence of more than MAXSHORT
|
||||
instances of whatever is denoted by the string S. */
|
||||
|
||||
void
|
||||
toomany (char *s)
|
||||
{
|
||||
fatal_banner ();
|
||||
fprintf (stderr, _("too many %s (max %d)"), s, MAXSHORT);
|
||||
fputc ('\n', stderr);
|
||||
done (1);
|
||||
}
|
||||
|
||||
/* Abort for an internal error denoted by string S. */
|
||||
|
||||
void
|
||||
berror (char *s)
|
||||
{
|
||||
fprintf(stderr, _("%s: internal error: %s\n"), program_name, s);
|
||||
fprintf (stderr, _("%s: internal error: %s\n"), program_name, s);
|
||||
abort();
|
||||
}
|
||||
|
||||
@@ -110,6 +110,7 @@ YYNTBASE = ntokens.
|
||||
#include "files.h"
|
||||
#include "gram.h"
|
||||
#include "state.h"
|
||||
#include "complain.h"
|
||||
|
||||
|
||||
extern int debugflag;
|
||||
@@ -133,7 +134,6 @@ extern char *consistent;
|
||||
extern short *goto_map;
|
||||
extern short *from_state;
|
||||
extern short *to_state;
|
||||
extern int lineno;
|
||||
|
||||
void output_headers PARAMS((void));
|
||||
void output_trailers PARAMS((void));
|
||||
@@ -164,8 +164,6 @@ int matching_state PARAMS((int));
|
||||
int pack_vector PARAMS((int));
|
||||
|
||||
extern void berror PARAMS((char *));
|
||||
extern void fatals PARAMS((char *, char *));
|
||||
extern char *int_to_string PARAMS((int));
|
||||
extern void reader_output_yylsp PARAMS((FILE *));
|
||||
|
||||
static int nvectors;
|
||||
@@ -1198,7 +1196,7 @@ pack_vector (int vector)
|
||||
{
|
||||
loc = j + from[k];
|
||||
if (loc > MAXTABLE)
|
||||
fatals(_("maximum table size (%s) exceeded"), int_to_string(MAXTABLE));
|
||||
fatal (_("maximum table size (%d) exceeded"), MAXTABLE);
|
||||
|
||||
if (table[loc] != 0)
|
||||
ok = 0;
|
||||
|
||||
200
src/reader.c
200
src/reader.c
@@ -35,6 +35,7 @@
|
||||
#include "lex.h"
|
||||
#include "gram.h"
|
||||
#include "machine.h"
|
||||
#include "complain.h"
|
||||
|
||||
#define LTYPESTR "\
|
||||
\n\
|
||||
@@ -61,7 +62,6 @@ typedef\n\
|
||||
/* Number of slots allocated (but not necessarily used yet) in `rline' */
|
||||
int rline_allocated;
|
||||
|
||||
extern char *program_name;
|
||||
extern int definesflag;
|
||||
extern int nolinesflag;
|
||||
extern int noparserflag;
|
||||
@@ -79,17 +79,8 @@ extern void output_headers PARAMS((void));
|
||||
extern void output_trailers PARAMS((void));
|
||||
extern void free_symtab PARAMS((void));
|
||||
extern void open_extra_files PARAMS((void));
|
||||
extern char *int_to_string PARAMS((int));
|
||||
extern char *printable_version PARAMS((int));
|
||||
extern void fatal PARAMS((char *));
|
||||
extern void fatals PARAMS((char *, char *));
|
||||
extern void warn PARAMS((char *));
|
||||
extern void warni PARAMS((char *, int));
|
||||
extern void warns PARAMS((char *, char *));
|
||||
extern void warnss PARAMS((char *, char *, char *));
|
||||
extern void warnsss PARAMS((char *, char *, char *, char *));
|
||||
extern void unlex PARAMS((int));
|
||||
extern void done PARAMS((int));
|
||||
|
||||
extern int skip_white_space PARAMS((void));
|
||||
extern int parse_percent_token PARAMS((void));
|
||||
@@ -160,9 +151,9 @@ skip_to_char (int target)
|
||||
{
|
||||
int c;
|
||||
if (target == '\n')
|
||||
warn(_(" Skipping to next \\n"));
|
||||
complain (_(" Skipping to next \\n"));
|
||||
else
|
||||
warni(_(" Skipping to next %c"), target);
|
||||
complain (_(" Skipping to next %c"), target);
|
||||
|
||||
do
|
||||
c = skip_white_space();
|
||||
@@ -189,7 +180,7 @@ copy_string (FILE *finput, FILE *foutput, int match)
|
||||
fatal (_("unterminated string at end of file"));
|
||||
if (c == '\n')
|
||||
{
|
||||
warn (_("unterminated string"));
|
||||
complain (_("unterminated string"));
|
||||
ungetc (c, finput);
|
||||
c = match; /* invent terminator */
|
||||
continue;
|
||||
@@ -221,7 +212,6 @@ static inline void
|
||||
copy_comment (FILE *finput, FILE *foutput, int c)
|
||||
{
|
||||
int cplus_comment;
|
||||
register int match;
|
||||
register int ended;
|
||||
|
||||
cplus_comment = (c == '/');
|
||||
@@ -431,15 +421,15 @@ read_declarations (void)
|
||||
break;
|
||||
|
||||
default:
|
||||
warns(_("unrecognized: %s"), token_buffer);
|
||||
complain (_("unrecognized: %s"), token_buffer);
|
||||
skip_to_char('%');
|
||||
}
|
||||
}
|
||||
else if (c == EOF)
|
||||
fatal(_("no input grammar"));
|
||||
fatal (_("no input grammar"));
|
||||
else
|
||||
{
|
||||
warns (_("unknown character: %s"), printable_version(c));
|
||||
complain (_("unknown character: %s"), printable_version(c));
|
||||
skip_to_char('%');
|
||||
}
|
||||
}
|
||||
@@ -490,7 +480,8 @@ copy_definition (void)
|
||||
break;
|
||||
|
||||
case EOF:
|
||||
fatal(_("unterminated `%{' definition"));
|
||||
fatal ("%s",
|
||||
_("unterminated `%{' definition"));
|
||||
|
||||
default:
|
||||
putc(c, fattrs);
|
||||
@@ -531,7 +522,7 @@ parse_token_decl (int what_is, int what_is_not)
|
||||
if (tmp_char == '%')
|
||||
return;
|
||||
if (tmp_char == EOF)
|
||||
fatals ("Premature EOF after %s", token_buffer);
|
||||
fatal (_("Premature EOF after %s"), token_buffer);
|
||||
|
||||
token = lex();
|
||||
if (token == COMMA)
|
||||
@@ -568,7 +559,7 @@ parse_token_decl (int what_is, int what_is_not)
|
||||
symbol = symval;
|
||||
|
||||
if (symbol->class == what_is_not)
|
||||
warns(_("symbol %s redefined"), symbol->tag);
|
||||
complain (_("symbol %s redefined"), symbol->tag);
|
||||
symbol->class = what_is;
|
||||
if (what_is == SNTERM && oldclass != SNTERM)
|
||||
symbol->value = nvars++;
|
||||
@@ -578,7 +569,7 @@ parse_token_decl (int what_is, int what_is_not)
|
||||
if (symbol->type_name == NULL)
|
||||
symbol->type_name = typename;
|
||||
else if (strcmp(typename, symbol->type_name) != 0)
|
||||
warns(_("type redeclaration for %s"), symbol->tag);
|
||||
complain (_("type redeclaration for %s"), symbol->tag);
|
||||
}
|
||||
}
|
||||
else if (symbol && token == NUMBER)
|
||||
@@ -588,8 +579,8 @@ parse_token_decl (int what_is, int what_is_not)
|
||||
}
|
||||
else
|
||||
{
|
||||
warnss(_("`%s' is invalid in %s"),
|
||||
token_buffer,
|
||||
complain (_("`%s' is invalid in %s"),
|
||||
token_buffer,
|
||||
(what_is == STOKEN) ? "%token" : "%nterm");
|
||||
skip_to_char('%');
|
||||
}
|
||||
@@ -636,8 +627,8 @@ parse_thong_decl (void)
|
||||
|
||||
if (token != IDENTIFIER)
|
||||
{
|
||||
warns(_("unrecognized item %s, expected an identifier"),
|
||||
token_buffer);
|
||||
complain (_("unrecognized item %s, expected an identifier"),
|
||||
token_buffer);
|
||||
skip_to_char('%');
|
||||
return;
|
||||
}
|
||||
@@ -658,8 +649,8 @@ parse_thong_decl (void)
|
||||
|
||||
if (token != IDENTIFIER || *symval->tag != '\"')
|
||||
{
|
||||
warns(_("expected string constant instead of %s"),
|
||||
token_buffer);
|
||||
complain (_("expected string constant instead of %s"),
|
||||
token_buffer);
|
||||
skip_to_char('%');
|
||||
return;
|
||||
}
|
||||
@@ -674,15 +665,15 @@ parse_thong_decl (void)
|
||||
}
|
||||
|
||||
|
||||
/* parse what comes after %start */
|
||||
/* Parse what comes after %start */
|
||||
|
||||
void
|
||||
parse_start_decl (void)
|
||||
{
|
||||
if (start_flag)
|
||||
warn(_("multiple %start declarations"));
|
||||
complain ("%s", _("multiple %start declarations"));
|
||||
if (lex() != IDENTIFIER)
|
||||
warn(_("invalid %start declaration"));
|
||||
complain ("%s", _("invalid %start declaration"));
|
||||
else
|
||||
{
|
||||
start_flag = 1;
|
||||
@@ -702,7 +693,7 @@ parse_type_decl (void)
|
||||
|
||||
if (lex() != TYPENAME)
|
||||
{
|
||||
warn(_("%type declaration has no <typename>"));
|
||||
complain ("%s", _("%type declaration has no <typename>"));
|
||||
skip_to_char('%');
|
||||
return;
|
||||
}
|
||||
@@ -719,7 +710,7 @@ parse_type_decl (void)
|
||||
if (tmp_char == '%')
|
||||
return;
|
||||
if (tmp_char == EOF)
|
||||
fatals ("Premature EOF after %s", token_buffer);
|
||||
fatal (_("Premature EOF after %s"), token_buffer);
|
||||
|
||||
t = lex();
|
||||
|
||||
@@ -734,12 +725,13 @@ parse_type_decl (void)
|
||||
if (symval->type_name == NULL)
|
||||
symval->type_name = name;
|
||||
else if (strcmp(name, symval->type_name) != 0)
|
||||
warns(_("type redeclaration for %s"), symval->tag);
|
||||
complain (_("type redeclaration for %s"), symval->tag);
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
warns(_("invalid %%type declaration due to item: `%s'"), token_buffer);
|
||||
complain (_("invalid %%type declaration due to item: %s"),
|
||||
token_buffer);
|
||||
skip_to_char('%');
|
||||
}
|
||||
}
|
||||
@@ -767,7 +759,7 @@ parse_assoc_decl (int assoc)
|
||||
if (tmp_char == '%')
|
||||
return;
|
||||
if (tmp_char == EOF)
|
||||
fatals ("Premature EOF after %s", token_buffer);
|
||||
fatal (_("Premature EOF after %s"), token_buffer);
|
||||
|
||||
t = lex();
|
||||
|
||||
@@ -785,18 +777,18 @@ parse_assoc_decl (int assoc)
|
||||
|
||||
case IDENTIFIER:
|
||||
if (symval->prec != 0)
|
||||
warns(_("redefining precedence of %s"), symval->tag);
|
||||
complain (_("redefining precedence of %s"), symval->tag);
|
||||
symval->prec = lastprec;
|
||||
symval->assoc = assoc;
|
||||
if (symval->class == SNTERM)
|
||||
warns(_("symbol %s redefined"), symval->tag);
|
||||
complain (_("symbol %s redefined"), symval->tag);
|
||||
symval->class = STOKEN;
|
||||
if (name)
|
||||
{ /* record the type, if one is specified */
|
||||
if (symval->type_name == NULL)
|
||||
symval->type_name = name;
|
||||
else if (strcmp(name, symval->type_name) != 0)
|
||||
warns(_("type redeclaration for %s"), symval->tag);
|
||||
complain (_("type redeclaration for %s"), symval->tag);
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -808,7 +800,7 @@ parse_assoc_decl (int assoc)
|
||||
}
|
||||
else
|
||||
{
|
||||
warns(_("invalid text (%s) - number should be after identifier"),
|
||||
complain (_("invalid text (%s) - number should be after identifier"),
|
||||
token_buffer);
|
||||
skip_to_char('%');
|
||||
}
|
||||
@@ -818,7 +810,7 @@ parse_assoc_decl (int assoc)
|
||||
return;
|
||||
|
||||
default:
|
||||
warns(_("unexpected item: %s"), token_buffer);
|
||||
complain (_("unexpected item: %s"), token_buffer);
|
||||
skip_to_char('%');
|
||||
}
|
||||
|
||||
@@ -842,7 +834,7 @@ parse_union_decl (void)
|
||||
int cplus_comment;
|
||||
|
||||
if (typed)
|
||||
warn(_("multiple %union declarations"));
|
||||
complain ("%s", _("multiple %union declarations"));
|
||||
|
||||
typed = 1;
|
||||
|
||||
@@ -900,7 +892,7 @@ parse_union_decl (void)
|
||||
}
|
||||
}
|
||||
if (c == EOF)
|
||||
fatal(_("unterminated comment at end of file"));
|
||||
fatal (_("unterminated comment at end of file"));
|
||||
|
||||
if (!cplus_comment && c == '*')
|
||||
{
|
||||
@@ -926,7 +918,7 @@ parse_union_decl (void)
|
||||
|
||||
case '}':
|
||||
if (count == 0)
|
||||
warn (_("unmatched close-brace (`}')"));
|
||||
complain (_("unmatched close-brace (`}')"));
|
||||
count--;
|
||||
if (count <= 0)
|
||||
{
|
||||
@@ -970,7 +962,7 @@ parse_expect_decl (void)
|
||||
ungetc (c, finput);
|
||||
|
||||
if (count <= 0 || count > 10)
|
||||
warn(_("argument of %expect is not an integer"));
|
||||
complain ("%s", _("argument of %expect is not an integer"));
|
||||
expected_conflicts = atoi (buffer);
|
||||
}
|
||||
|
||||
@@ -1002,23 +994,22 @@ copy_at (FILE *finput, FILE *foutput, int stack_offset)
|
||||
yylsp_needed = 1;
|
||||
}
|
||||
else
|
||||
warns (_("@%s is invalid"), printable_version (c));
|
||||
complain (_("@%s is invalid"), printable_version (c));
|
||||
}
|
||||
|
||||
|
||||
/* Get the data type (alternative in the union) of the value for symbol n in rule rule. */
|
||||
/* Get the data type (alternative in the union) of the value for
|
||||
symbol n in rule rule. */
|
||||
|
||||
char *
|
||||
get_type_name (int n, symbol_list *rule)
|
||||
{
|
||||
static char *msg = N_("invalid $ value");
|
||||
|
||||
register int i;
|
||||
register symbol_list *rp;
|
||||
|
||||
if (n < 0)
|
||||
{
|
||||
warn(_(msg));
|
||||
complain (_("invalid $ value"));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -1030,7 +1021,7 @@ get_type_name (int n, symbol_list *rule)
|
||||
rp = rp->next;
|
||||
if (rp == NULL || rp->sym == NULL)
|
||||
{
|
||||
warn(_(msg));
|
||||
complain (_("invalid $ value"));
|
||||
return NULL;
|
||||
}
|
||||
i++;
|
||||
@@ -1089,7 +1080,7 @@ copy_guard (symbol_list *rule, int stack_offset)
|
||||
count--;
|
||||
else
|
||||
{
|
||||
warn(_("unmatched right brace (`}')"));
|
||||
complain (_("unmatched right brace (`}')"));
|
||||
c = getc(finput); /* skip it */
|
||||
}
|
||||
break;
|
||||
@@ -1136,7 +1127,8 @@ copy_guard (symbol_list *rule, int stack_offset)
|
||||
if (type_name)
|
||||
fprintf(fguard, ".%s", type_name);
|
||||
if(!type_name && typed)
|
||||
warns(_("$$ of `%s' has no declared type"), rule->sym->tag);
|
||||
complain (_("$$ of `%s' has no declared type"),
|
||||
rule->sym->tag);
|
||||
}
|
||||
else if (isdigit(c) || c == '-')
|
||||
{
|
||||
@@ -1151,12 +1143,12 @@ copy_guard (symbol_list *rule, int stack_offset)
|
||||
if (type_name)
|
||||
fprintf(fguard, ".%s", type_name);
|
||||
if (!type_name && typed)
|
||||
warnss (_("$%s of `%s' has no declared type"),
|
||||
int_to_string(n), rule->sym->tag);
|
||||
complain (_("$%d of `%s' has no declared type"),
|
||||
n, rule->sym->tag);
|
||||
continue;
|
||||
}
|
||||
else
|
||||
warns(_("$%s is invalid"), printable_version(c));
|
||||
complain (_("$%s is invalid"), printable_version (c));
|
||||
break;
|
||||
|
||||
case '@':
|
||||
@@ -1164,7 +1156,8 @@ copy_guard (symbol_list *rule, int stack_offset)
|
||||
break;
|
||||
|
||||
case EOF:
|
||||
fatal (_("unterminated %%guard clause"));
|
||||
fatal ("%s",
|
||||
_("unterminated %guard clause"));
|
||||
|
||||
default:
|
||||
putc (c, fguard);
|
||||
@@ -1274,8 +1267,8 @@ copy_action (symbol_list *rule, int stack_offset)
|
||||
if (type_name)
|
||||
fprintf(faction, ".%s", type_name);
|
||||
if(!type_name && typed)
|
||||
warns(_("$$ of `%s' has no declared type"),
|
||||
rule->sym->tag);
|
||||
complain (_("$$ of `%s' has no declared type"),
|
||||
rule->sym->tag);
|
||||
}
|
||||
else if (isdigit(c) || c == '-')
|
||||
{
|
||||
@@ -1290,12 +1283,12 @@ copy_action (symbol_list *rule, int stack_offset)
|
||||
if (type_name)
|
||||
fprintf(faction, ".%s", type_name);
|
||||
if(!type_name && typed)
|
||||
warnss(_("$%s of `%s' has no declared type"),
|
||||
int_to_string(n), rule->sym->tag);
|
||||
complain (_("$%d of `%s' has no declared type"),
|
||||
n, rule->sym->tag);
|
||||
continue;
|
||||
}
|
||||
else
|
||||
warns(_("$%s is invalid"), printable_version(c));
|
||||
complain (_("$%s is invalid"), printable_version (c));
|
||||
|
||||
break;
|
||||
|
||||
@@ -1304,7 +1297,7 @@ copy_action (symbol_list *rule, int stack_offset)
|
||||
break;
|
||||
|
||||
case EOF:
|
||||
fatal(_("unmatched `{'"));
|
||||
fatal (_("unmatched `{'"));
|
||||
|
||||
default:
|
||||
putc(c, faction);
|
||||
@@ -1390,14 +1383,14 @@ readgram (void)
|
||||
t = lex();
|
||||
if (t != COLON)
|
||||
{
|
||||
warn(_("ill-formed rule: initial symbol not followed by colon"));
|
||||
complain (_("ill-formed rule: initial symbol not followed by colon"));
|
||||
unlex(t);
|
||||
}
|
||||
}
|
||||
|
||||
if (nrules == 0 && t == BAR)
|
||||
{
|
||||
warn(_("grammar starts with vertical bar"));
|
||||
complain (_("grammar starts with vertical bar"));
|
||||
lhs = symval; /* BOGUS: use a random symval */
|
||||
}
|
||||
/* start a new rule and record its lhs. */
|
||||
@@ -1428,7 +1421,7 @@ readgram (void)
|
||||
nvars++;
|
||||
}
|
||||
else if (lhs->class == STOKEN)
|
||||
warns(_("rule given for %s, which is a token"), lhs->tag);
|
||||
complain (_("rule given for %s, which is a token"), lhs->tag);
|
||||
|
||||
/* read the rhs of the rule. */
|
||||
|
||||
@@ -1526,7 +1519,7 @@ readgram (void)
|
||||
|
||||
if (t == PREC)
|
||||
{
|
||||
warn(_("two @prec's in a row"));
|
||||
complain (_("two @prec's in a row"));
|
||||
t = lex();
|
||||
crule->ruleprec = symval;
|
||||
t = lex();
|
||||
@@ -1534,7 +1527,8 @@ readgram (void)
|
||||
if (t == GUARD)
|
||||
{
|
||||
if (! semantic_parser)
|
||||
warn(_("%%guard present but %%semantic_parser not specified"));
|
||||
complain ("%s",
|
||||
_("%guard present but %semantic_parser not specified"));
|
||||
|
||||
copy_guard(crule, rulelength);
|
||||
t = lex();
|
||||
@@ -1543,13 +1537,13 @@ readgram (void)
|
||||
{
|
||||
/* This case never occurs -wjh */
|
||||
if (actionflag)
|
||||
warn(_("two actions at end of one rule"));
|
||||
complain (_("two actions at end of one rule"));
|
||||
copy_action(crule, rulelength);
|
||||
actionflag = 1;
|
||||
xactions++; /* -wjh */
|
||||
t = lex();
|
||||
}
|
||||
/* If $$ is being set in default way, warn if any type
|
||||
/* If $$ is being set in default way, report if any type
|
||||
mismatch. */
|
||||
else if (!xactions
|
||||
&& first_rhs
|
||||
@@ -1558,13 +1552,13 @@ readgram (void)
|
||||
if (lhs->type_name == 0
|
||||
|| first_rhs->type_name == 0
|
||||
|| strcmp(lhs->type_name,first_rhs->type_name))
|
||||
warnss(_("type clash (`%s' `%s') on default action"),
|
||||
lhs->type_name ? lhs->type_name : "",
|
||||
first_rhs->type_name ? first_rhs->type_name : "");
|
||||
complain (_("type clash (`%s' `%s') on default action"),
|
||||
lhs->type_name ? lhs->type_name : "",
|
||||
first_rhs->type_name ? first_rhs->type_name : "");
|
||||
}
|
||||
/* Warn if there is no default for $$ but we need one. */
|
||||
else if (!xactions && !first_rhs && lhs->type_name != 0)
|
||||
warn(_("empty rule for typed nonterminal, and no action"));
|
||||
complain (_("empty rule for typed nonterminal, and no action"));
|
||||
if (t == SEMICOLON)
|
||||
t = lex();
|
||||
}
|
||||
@@ -1608,7 +1602,7 @@ readgram (void)
|
||||
|
||||
else
|
||||
{
|
||||
warns(_("invalid input: %s"), token_buffer);
|
||||
complain (_("invalid input: %s"), token_buffer);
|
||||
t = lex();
|
||||
}
|
||||
}
|
||||
@@ -1616,10 +1610,10 @@ readgram (void)
|
||||
/* grammar has been read. Do some checking */
|
||||
|
||||
if (nsyms > MAXSHORT)
|
||||
fatals(_("too many symbols (tokens plus nonterminals); maximum %s"),
|
||||
int_to_string(MAXSHORT));
|
||||
fatal (_("too many symbols (tokens plus nonterminals); maximum %d"),
|
||||
MAXSHORT);
|
||||
if (nrules == 0)
|
||||
fatal(_("no rules in the input grammar"));
|
||||
fatal (_("no rules in the input grammar"));
|
||||
|
||||
if (typed == 0 /* JF put out same default YYSTYPE as YACC does */
|
||||
&& !value_components_used)
|
||||
@@ -1637,8 +1631,8 @@ readgram (void)
|
||||
for (bp = firstsymbol; bp; bp = bp->next)
|
||||
if (bp->class == SUNKNOWN)
|
||||
{
|
||||
warns(_("symbol %s is used, but is not defined as a token and has no rules"),
|
||||
bp->tag);
|
||||
complain (_("symbol %s is used, but is not defined as a token and has no rules"),
|
||||
bp->tag);
|
||||
bp->class = SNTERM;
|
||||
bp->value = nvars++;
|
||||
}
|
||||
@@ -1676,7 +1670,7 @@ get_type (void)
|
||||
|
||||
if (t != TYPENAME)
|
||||
{
|
||||
warn(_("ill-formed %type declaration"));
|
||||
complain (_("ill-formed %type declaration"));
|
||||
return t;
|
||||
}
|
||||
|
||||
@@ -1700,7 +1694,7 @@ get_type (void)
|
||||
if (symval->type_name == NULL)
|
||||
symval->type_name = name;
|
||||
else if (strcmp(name, symval->type_name) != 0)
|
||||
warns(_("type redeclaration for %s"), symval->tag);
|
||||
complain (_("type redeclaration for %s"), symval->tag);
|
||||
|
||||
break;
|
||||
|
||||
@@ -1755,8 +1749,8 @@ packsymbols (void)
|
||||
{
|
||||
if (bp->prec != 0 && bp->alias->prec != 0
|
||||
&& bp->user_token_number == SALIAS)
|
||||
warnss(_("conflicting precedences for %s and %s"),
|
||||
bp->tag, bp->alias->tag);
|
||||
complain (_("conflicting precedences for %s and %s"),
|
||||
bp->tag, bp->alias->tag);
|
||||
if (bp->prec != 0)
|
||||
bp->alias->prec = bp->prec;
|
||||
else
|
||||
@@ -1765,15 +1759,15 @@ packsymbols (void)
|
||||
|
||||
if (bp->assoc != bp->alias->assoc)
|
||||
{
|
||||
if (bp->assoc != 0 && bp->alias->assoc != 0
|
||||
&& bp->user_token_number == SALIAS)
|
||||
warnss(_("conflicting assoc values for %s and %s"),
|
||||
bp->tag, bp->alias->tag);
|
||||
if (bp->assoc != 0)
|
||||
bp->alias->assoc = bp->assoc;
|
||||
else
|
||||
bp->assoc = bp->alias->assoc;
|
||||
}
|
||||
if (bp->assoc != 0 && bp->alias->assoc != 0
|
||||
&& bp->user_token_number == SALIAS)
|
||||
complain (_("conflicting assoc values for %s and %s"),
|
||||
bp->tag, bp->alias->tag);
|
||||
if (bp->assoc != 0)
|
||||
bp->alias->assoc = bp->assoc;
|
||||
else
|
||||
bp->assoc = bp->alias->assoc;
|
||||
}
|
||||
|
||||
if (bp->user_token_number == SALIAS)
|
||||
continue; /* do not do processing below for SALIASs */
|
||||
@@ -1818,10 +1812,10 @@ packsymbols (void)
|
||||
if (bp->user_token_number == SALIAS)
|
||||
continue;
|
||||
if (token_translations[bp->user_token_number] != 2)
|
||||
warnsss(_("tokens %s and %s both assigned number %s"),
|
||||
tags[token_translations[bp->user_token_number]],
|
||||
bp->tag,
|
||||
int_to_string(bp->user_token_number));
|
||||
complain (_("tokens %s and %s both assigned number %d"),
|
||||
tags[token_translations[bp->user_token_number]],
|
||||
bp->tag,
|
||||
bp->user_token_number);
|
||||
token_translations[bp->user_token_number] = bp->value;
|
||||
}
|
||||
}
|
||||
@@ -1832,9 +1826,9 @@ packsymbols (void)
|
||||
output_token_defines(ftable);
|
||||
|
||||
if (startval->class == SUNKNOWN)
|
||||
fatals(_("the start symbol %s is undefined"), startval->tag);
|
||||
fatal (_("the start symbol %s is undefined"), startval->tag);
|
||||
else if (startval->class == STOKEN)
|
||||
fatals(_("the start symbol %s is a token"), startval->tag);
|
||||
fatal (_("the start symbol %s is a token"), startval->tag);
|
||||
|
||||
start_symbol = startval->value;
|
||||
|
||||
@@ -1898,12 +1892,12 @@ output_token_defines (FILE *file)
|
||||
while ((c = *cp++) && c != '.');
|
||||
if (c != '\0') continue;
|
||||
|
||||
fprintf(file, "#define\t%s\t%d\n", symbol,
|
||||
((translations && ! rawtoknumflag)
|
||||
? bp->user_token_number
|
||||
: bp->value));
|
||||
fprintf (file, "#define\t%s\t%d\n", symbol,
|
||||
((translations && ! rawtoknumflag)
|
||||
? bp->user_token_number
|
||||
: bp->value));
|
||||
if (semantic_parser)
|
||||
fprintf(file, "#define\tT%s\t%d\n", symbol, bp->value);
|
||||
fprintf (file, "#define\tT%s\t%d\n", symbol, bp->value);
|
||||
}
|
||||
|
||||
putc('\n', file);
|
||||
|
||||
@@ -35,6 +35,7 @@ Boston, MA 02111-1307, USA. */
|
||||
#include "gram.h"
|
||||
#include "machine.h"
|
||||
#include "alloc.h"
|
||||
#include "complain.h"
|
||||
|
||||
|
||||
extern char **tags; /* reader.c */
|
||||
@@ -74,7 +75,6 @@ static void print_results PARAMS((void));
|
||||
static void print_notices PARAMS((void));
|
||||
void dump_grammar PARAMS((void));
|
||||
|
||||
extern void fatals PARAMS((char *, char *));
|
||||
|
||||
|
||||
bool
|
||||
@@ -138,7 +138,7 @@ reduce_grammar (void)
|
||||
print_notices();
|
||||
|
||||
if (!BITISSET(N, start_symbol - ntokens))
|
||||
fatals(_("Start symbol %s does not derive any sentence"),
|
||||
fatal (_("Start symbol %s does not derive any sentence"),
|
||||
tags[start_symbol]);
|
||||
|
||||
reduce_grammar_tables();
|
||||
|
||||
84
src/system.h
84
src/system.h
@@ -1,3 +1,20 @@
|
||||
/* system-dependent definitions for Bison.
|
||||
Copyright (C) 2000 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
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program 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 this program; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
|
||||
#ifndef BISON_SYSTEM_H
|
||||
#define BISON_SYSTEM_H
|
||||
|
||||
@@ -6,45 +23,73 @@
|
||||
#endif
|
||||
|
||||
#ifdef MSDOS
|
||||
#include <io.h>
|
||||
# include <io.h>
|
||||
#endif
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#include <stdlib.h>
|
||||
#include <process.h>
|
||||
#define getpid _getpid
|
||||
# include <stdlib.h>
|
||||
# include <process.h>
|
||||
# define getpid _getpid
|
||||
#endif
|
||||
|
||||
#if defined(HAVE_STDLIB_H) || defined(MSDOS)
|
||||
#include <stdlib.h>
|
||||
# include <stdlib.h>
|
||||
#endif
|
||||
|
||||
#if defined(HAVE_UNISTD_H)
|
||||
#include <unistd.h>
|
||||
# include <unistd.h>
|
||||
#endif
|
||||
|
||||
#if (defined(VMS) || defined(MSDOS)) && !defined(HAVE_STRING_H)
|
||||
#define HAVE_STRING_H 1
|
||||
# define HAVE_STRING_H 1
|
||||
#endif
|
||||
|
||||
#if defined(STDC_HEADERS) || defined(HAVE_STRING_H)
|
||||
#include <string.h>
|
||||
# include <string.h>
|
||||
/* An ANSI string.h and pre-ANSI memory.h might conflict. */
|
||||
#if !defined(STDC_HEADERS) && defined(HAVE_MEMORY_H)
|
||||
#include <memory.h>
|
||||
#endif /* not STDC_HEADERS and HAVE_MEMORY_H */
|
||||
#ifndef bcopy
|
||||
#define bcopy(src, dst, num) memcpy((dst), (src), (num))
|
||||
#endif
|
||||
# if !defined(STDC_HEADERS) && defined(HAVE_MEMORY_H)
|
||||
# include <memory.h>
|
||||
# endif /* not STDC_HEADERS and HAVE_MEMORY_H */
|
||||
# ifndef bcopy
|
||||
# define bcopy(src, dst, num) memcpy((dst), (src), (num))
|
||||
# endif
|
||||
#else /* not STDC_HEADERS and not HAVE_STRING_H */
|
||||
#include <strings.h>
|
||||
# include <strings.h>
|
||||
/* memory.h and strings.h conflict on some systems. */
|
||||
#endif /* not STDC_HEADERS and not HAVE_STRING_H */
|
||||
|
||||
#if defined(STDC_HEADERS) || defined(HAVE_CTYPE_H)
|
||||
#include <ctype.h>
|
||||
# include <ctype.h>
|
||||
#endif
|
||||
|
||||
#include <errno.h>
|
||||
#ifndef errno
|
||||
extern int errno;
|
||||
#endif
|
||||
|
||||
|
||||
/*-----------------.
|
||||
| GCC extensions. |
|
||||
`-----------------*/
|
||||
|
||||
#ifndef __attribute__
|
||||
/* This feature is available in gcc versions 2.5 and later. */
|
||||
# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__
|
||||
# define __attribute__(Spec) /* empty */
|
||||
# endif
|
||||
/* The __-protected variants of `format' and `printf' attributes
|
||||
are accepted by gcc versions 2.6.4 (effectively 2.7) and later. */
|
||||
# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7)
|
||||
# define __format__ format
|
||||
# define __printf__ printf
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
||||
/*------.
|
||||
| NLS. |
|
||||
`------*/
|
||||
|
||||
#ifdef HAVE_LOCALE_H
|
||||
# include <locale.h>
|
||||
#endif
|
||||
@@ -64,8 +109,13 @@
|
||||
#endif
|
||||
#define N_(Text) Text
|
||||
|
||||
|
||||
/*-------------------------------.
|
||||
| Fix broken compilation flags. |
|
||||
`-------------------------------*/
|
||||
|
||||
#ifndef LOCALEDIR
|
||||
#define LOCALEDIR "/usr/local/share/locale"
|
||||
# define LOCALEDIR "/usr/local/share/locale"
|
||||
#endif
|
||||
|
||||
#endif /* BISON_SYSTEM_H */
|
||||
|
||||
Reference in New Issue
Block a user