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:
Akim Demaille
2000-03-31 13:54:30 +00:00
parent 10a9273b34
commit a0f6b07611
24 changed files with 1235 additions and 890 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View 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();

View File

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