]> git.saurik.com Git - bison.git/blobdiff - src/reader.c
* bison.s1 (#line): All set to `#line' only, since the Makefile
[bison.git] / src / reader.c
index bd8359133912648dd7dffe34a7b62dfab2638180..e67a11891793478e0c550a7e264f1293f6f92a95 100644 (file)
@@ -1,5 +1,5 @@
 /* Input parser for bison
 /* Input parser for bison
-   Copyright (C) 1984, 1986, 1989, 1992 Free Software Foundation, Inc.
+   Copyright (C) 1984, 1986, 1989, 1992, 1998 Free Software Foundation, Inc.
 
 This file is part of Bison, the GNU Compiler Compiler.
 
 
 This file is part of Bison, the GNU Compiler Compiler.
 
@@ -15,7 +15,8 @@ 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
 
 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, 675 Mass Ave, Cambridge, MA 02139, USA.  */
+the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
 
 
 /* read in the grammar specification and record it in the format described in gram.h.
 
 
 /* read in the grammar specification and record it in the format described in gram.h.
@@ -26,10 +27,9 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
 The entry point is reader().  */
 
 #include <stdio.h>
 The entry point is reader().  */
 
 #include <stdio.h>
-#include <ctype.h>
 #include "system.h"
 #include "files.h"
 #include "system.h"
 #include "files.h"
-#include "new.h"
+#include "alloc.h"
 #include "symtab.h"
 #include "lex.h"
 #include "gram.h"
 #include "symtab.h"
 #include "lex.h"
 #include "gram.h"
@@ -52,46 +52,30 @@ extern bucket *symval;
 extern int numval;
 extern int expected_conflicts;
 extern char *token_buffer;
 extern int numval;
 extern int expected_conflicts;
 extern char *token_buffer;
-
-extern void init_lex();
-extern void tabinit();
-extern void output_headers();
-extern void output_trailers();
-extern void free_symtab();
-extern void open_extra_files();
-extern char *int_to_string();
-extern void fatal();
-extern void fatals();
-extern void warn();
-extern void warni();
-extern void warns();
-extern void warnss();
-extern void warnsss();
-extern void unlex();
-extern void done();
-
-extern int skip_white_space();
-extern int parse_percent_token();
-extern int lex();
-
-void reader_output_yylsp();
-void read_declarations();
-void copy_definition();
-void parse_token_decl();
-void parse_start_decl();
-void parse_type_decl();
-void parse_assoc_decl();
-void parse_union_decl();
-void parse_expect_decl();
-void parse_thong_decl();
-void copy_action();
-void readgram();
-void record_rule_line();
-void packsymbols();
-void output_token_defines();
-void packgram();
-int read_signed_integer();
-static int get_type();
+extern int maxtoken;
+
+extern void init_lex PARAMS((void));
+extern char *grow_token_buffer PARAMS((char *));
+extern void tabinit PARAMS((void));
+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));
+extern int lex PARAMS((void));
 
 typedef
   struct symbol_list
 
 typedef
   struct symbol_list
@@ -103,6 +87,31 @@ typedef
   symbol_list;
 
 
   symbol_list;
 
 
+void reader PARAMS((void));
+void reader_output_yylsp PARAMS((FILE *));
+void read_declarations PARAMS((void));
+void copy_definition PARAMS((void));
+void parse_token_decl PARAMS((int, int));
+void parse_start_decl PARAMS((void));
+void parse_type_decl PARAMS((void));
+void parse_assoc_decl PARAMS((int));
+void parse_union_decl PARAMS((void));
+void parse_expect_decl PARAMS((void));
+char *get_type_name PARAMS((int, symbol_list *));
+void copy_guard PARAMS((symbol_list *, int));
+void parse_thong_decl PARAMS((void));
+void copy_action PARAMS((symbol_list *, int));
+bucket *gensym PARAMS((void));
+void readgram PARAMS((void));
+void record_rule_line PARAMS((void));
+void packsymbols PARAMS((void));
+void output_token_defines PARAMS((FILE *));
+void packgram PARAMS((void));
+int read_signed_integer PARAMS((FILE *));
+
+#if 0
+static int get_type PARAMS((void));
+#endif
 
 int lineno;
 symbol_list *grammar;
 
 int lineno;
 symbol_list *grammar;
@@ -122,16 +131,14 @@ static int lastprec;  /* incremented for each %left, %right or %nonassoc seen */
 static int gensym_count;  /* incremented for each generated symbol */
 
 static bucket *errtoken;
 static int gensym_count;  /* incremented for each generated symbol */
 
 static bucket *errtoken;
+static bucket *undeftoken;
 
 /* Nonzero if any action or guard uses the @n construct.  */
 static int yylsp_needed;
 
 
 /* Nonzero if any action or guard uses the @n construct.  */
 static int yylsp_needed;
 
-extern char *version_string;
-
 
 static void
 
 static void
-skip_to_char(target)
-     int target;
+skip_to_char (int target)
 {
   int c;
   if (target == '\n')
 {
   int c;
   if (target == '\n')
@@ -148,7 +155,7 @@ skip_to_char(target)
 
 
 void
 
 
 void
-reader()
+reader (void)
 {
   start_flag = 0;
   startval = NULL;  /* start symbol not specified yet. */
 {
   start_flag = 0;
   startval = NULL;  /* start symbol not specified yet. */
@@ -190,7 +197,9 @@ reader()
   errtoken->user_token_number = 256; /* Value specified by posix.  */
   /* construct a token that represents all undefined literal tokens. */
   /* it is always token number 2.  */
   errtoken->user_token_number = 256; /* Value specified by posix.  */
   /* construct a token that represents all undefined literal tokens. */
   /* it is always token number 2.  */
-  getsym("$undefined.")->class = STOKEN;
+  undeftoken = getsym("$undefined.");
+  undeftoken->class = STOKEN;
+  undeftoken->user_token_number = 2;
   /* Read the declaration section.  Copy %{ ... %} groups to ftable and fdefines file.
      Also notice any %token, %left, etc. found there.  */
   if (noparserflag)
   /* Read the declaration section.  Copy %{ ... %} groups to ftable and fdefines file.
      Also notice any %token, %left, etc. found there.  */
   if (noparserflag)
@@ -198,7 +207,7 @@ reader()
                infile);
   else
     fprintf(ftable, "\n/*  A Bison parser, made from %s\n", infile);
                infile);
   else
     fprintf(ftable, "\n/*  A Bison parser, made from %s\n", infile);
-  fprintf(ftable, " by  %s  */\n\n", version_string);
+  fprintf(ftable, "    by %s  */\n\n", VERSION_STRING);
   fprintf(ftable, "#define YYBISON 1  /* Identify Bison output.  */\n\n");
   read_declarations();
   /* start writing the guard and action files, if they are needed.  */
   fprintf(ftable, "#define YYBISON 1  /* Identify Bison output.  */\n\n");
   read_declarations();
   /* start writing the guard and action files, if they are needed.  */
@@ -224,8 +233,7 @@ reader()
 }
 
 void
 }
 
 void
-reader_output_yylsp(f)
-     FILE *f;
+reader_output_yylsp (FILE *f)
 {
   if (yylsp_needed)
     fprintf(f, LTYPESTR);
 {
   if (yylsp_needed)
     fprintf(f, LTYPESTR);
@@ -236,7 +244,7 @@ Handle any % declarations,
 and copy the contents of any %{ ... %} groups to fattrs.  */
 
 void
 and copy the contents of any %{ ... %} groups to fattrs.  */
 
 void
-read_declarations ()
+read_declarations (void)
 {
   register int c;
   register int tok;
 {
   register int c;
   register int tok;
@@ -333,7 +341,7 @@ read_declarations ()
 The %{ has already been read.  Return after reading the %}.  */
 
 void
 The %{ has already been read.  Return after reading the %}.  */
 
 void
-copy_definition ()
+copy_definition (void)
 {
   register int c;
   register int match;
 {
   register int c;
   register int match;
@@ -472,8 +480,7 @@ For %token, what_is is STOKEN and what_is_not is SNTERM.
 For %nterm, the arguments are reversed.  */
 
 void
 For %nterm, the arguments are reversed.  */
 
 void
-parse_token_decl (what_is, what_is_not)
-     int what_is, what_is_not;
+parse_token_decl (int what_is, int what_is_not)
 {
   register int token = 0;
   register char *typename = 0;
 {
   register int token = 0;
   register char *typename = 0;
@@ -482,8 +489,13 @@ parse_token_decl (what_is, what_is_not)
 
   for (;;)
     {
 
   for (;;)
     {
-      if(ungetc(skip_white_space(), finput) == '%')
+      int tmp_char = ungetc (skip_white_space (), finput);
+
+      if (tmp_char == '%')
        return;
        return;
+      if (tmp_char == EOF)
+       fatals ("Premature EOF after %s", token_buffer);
+
       token = lex();
       if (token == COMMA)
        {
       token = lex();
       if (token == COMMA)
        {
@@ -566,7 +578,7 @@ parse_token_decl (what_is, what_is_not)
 */
 
 void
 */
 
 void
-parse_thong_decl ()
+parse_thong_decl (void)
 {
   register int token;
   register struct bucket *symbol;
 {
   register int token;
   register struct bucket *symbol;
@@ -628,7 +640,7 @@ parse_thong_decl ()
 /* parse what comes after %start */
 
 void
 /* parse what comes after %start */
 
 void
-parse_start_decl ()
+parse_start_decl (void)
 {
   if (start_flag)
     warn(_("multiple %start declarations"));
 {
   if (start_flag)
     warn(_("multiple %start declarations"));
@@ -646,7 +658,7 @@ parse_start_decl ()
 /* read in a %type declaration and record its information for get_type_name to access */
 
 void
 /* read in a %type declaration and record its information for get_type_name to access */
 
 void
-parse_type_decl ()
+parse_type_decl (void)
 {
   register int k;
   register char *name;
 {
   register int k;
   register char *name;
@@ -665,9 +677,12 @@ parse_type_decl ()
   for (;;)
     {
       register int t;
   for (;;)
     {
       register int t;
+      int tmp_char = ungetc (skip_white_space (), finput);
 
 
-      if(ungetc(skip_white_space(), finput) == '%')
+      if (tmp_char == '%')
        return;
        return;
+      if (tmp_char == EOF)
+       fatals ("Premature EOF after %s", token_buffer);
 
       t = lex();
 
 
       t = lex();
 
@@ -699,8 +714,7 @@ parse_type_decl ()
 /* assoc is either LEFT_ASSOC, RIGHT_ASSOC or NON_ASSOC.  */
 
 void
 /* assoc is either LEFT_ASSOC, RIGHT_ASSOC or NON_ASSOC.  */
 
 void
-parse_assoc_decl (assoc)
-int assoc;
+parse_assoc_decl (int assoc)
 {
   register int k;
   register char *name = NULL;
 {
   register int k;
   register char *name = NULL;
@@ -711,9 +725,12 @@ int assoc;
   for (;;)
     {
       register int t;
   for (;;)
     {
       register int t;
+      int tmp_char = ungetc (skip_white_space (), finput);
 
 
-      if(ungetc(skip_white_space(), finput) == '%')
+      if (tmp_char == '%')
        return;
        return;
+      if (tmp_char == EOF)
+       fatals ("Premature EOF after %s", token_buffer);
 
       t = lex();
 
 
       t = lex();
 
@@ -780,7 +797,7 @@ int assoc;
    definition of YYSTYPE, the type of elements of the parser value stack.  */
 
 void
    definition of YYSTYPE, the type of elements of the parser value stack.  */
 
 void
-parse_union_decl()
+parse_union_decl (void)
 {
   register int c;
   register int count;
 {
   register int c;
   register int count;
@@ -894,7 +911,7 @@ parse_union_decl()
    shift-reduce conflicts.  */
 
 void
    shift-reduce conflicts.  */
 
 void
-parse_expect_decl()
+parse_expect_decl (void)
 {
   register int c;
   register int count;
 {
   register int c;
   register int count;
@@ -925,9 +942,7 @@ parse_expect_decl()
 /* Get the data type (alternative in the union) of the value for symbol n in rule rule.  */
 
 char *
 /* Get the data type (alternative in the union) of the value for symbol n in rule rule.  */
 
 char *
-get_type_name(n, rule)
-int n;
-symbol_list *rule;
+get_type_name (int n, symbol_list *rule)
 {
   static char *msg = N_("invalid $ value");
 
 {
   static char *msg = N_("invalid $ value");
 
@@ -966,9 +981,7 @@ which says where to find $0 with respect to the top of the stack,
 for the simple parser in which the stack is not popped until after the guard is run.  */
 
 void
 for the simple parser in which the stack is not popped until after the guard is run.  */
 
 void
-copy_guard(rule, stack_offset)
-symbol_list *rule;
-int stack_offset;
+copy_guard (symbol_list *rule, int stack_offset)
 {
   register int c;
   register int n;
 {
   register int c;
   register int n;
@@ -1108,7 +1121,12 @@ int stack_offset;
              register char *cp = token_buffer;
 
              while ((c = getc(finput)) != '>' && c > 0)
              register char *cp = token_buffer;
 
              while ((c = getc(finput)) != '>' && c > 0)
-               *cp++ = c;
+               {
+                 if (cp == token_buffer + maxtoken)
+                   cp = grow_token_buffer(cp);
+
+                 *cp++ = c;
+               }
              *cp = 0;
              type_name = token_buffer;
 
              *cp = 0;
              type_name = token_buffer;
 
@@ -1142,7 +1160,7 @@ int stack_offset;
              continue;
            }
          else
              continue;
            }
          else
-           warni(_("$%s is invalid"), printable_version(c));
+           warns(_("$%s is invalid"), printable_version(c));
 
          break;
 
 
          break;
 
@@ -1156,7 +1174,7 @@ int stack_offset;
            }
          else
            {
            }
          else
            {
-             warni(_("@%s is invalid"), printable_version(c));
+             warns(_("@%s is invalid"), printable_version(c));
              n = 1;
            }
 
              n = 1;
            }
 
@@ -1199,9 +1217,7 @@ stack_offset is the number of values in the current rule so far,
 which says where to find $0 with respect to the top of the stack.  */
 
 void
 which says where to find $0 with respect to the top of the stack.  */
 
 void
-copy_action(rule, stack_offset)
-symbol_list *rule;
-int stack_offset;
+copy_action (symbol_list *rule, int stack_offset)
 {
   register int c;
   register int n;
 {
   register int c;
   register int n;
@@ -1330,7 +1346,12 @@ int stack_offset;
                  register char *cp = token_buffer;
 
                  while ((c = getc(finput)) != '>' && c > 0)
                  register char *cp = token_buffer;
 
                  while ((c = getc(finput)) != '>' && c > 0)
-                   *cp++ = c;
+                   {
+                     if (cp == token_buffer + maxtoken)
+                       cp = grow_token_buffer(cp);
+
+                     *cp++ = c;
+                   }
                  *cp = 0;
                  type_name = token_buffer;
                  value_components_used = 1;
                  *cp = 0;
                  type_name = token_buffer;
                  value_components_used = 1;
@@ -1364,7 +1385,7 @@ int stack_offset;
                  continue;
                }
              else
                  continue;
                }
              else
-               warni(_("$%s is invalid"), printable_version(c));
+               warns(_("$%s is invalid"), printable_version(c));
 
              break;
 
 
              break;
 
@@ -1415,7 +1436,7 @@ int stack_offset;
 whose name cannot conflict with the user's names. */
 
 bucket *
 whose name cannot conflict with the user's names. */
 
 bucket *
-gensym()
+gensym (void)
 {
   register bucket *sym;
 
 {
   register bucket *sym;
 
@@ -1436,10 +1457,10 @@ All guards and actions are copied out to the appropriate files,
 labelled by the rule number they apply to.  */
 
 void
 labelled by the rule number they apply to.  */
 
 void
-readgram()
+readgram (void)
 {
   register int t;
 {
   register int t;
-  register bucket *lhs;
+  register bucket *lhs = NULL;
   register symbol_list *p;
   register symbol_list *p1;
   register bucket *bp;
   register symbol_list *p;
   register symbol_list *p1;
   register bucket *bp;
@@ -1728,24 +1749,25 @@ readgram()
 
 
 void
 
 
 void
-record_rule_line ()
+record_rule_line (void)
 {
   /* Record each rule's source line number in rline table.  */
 
   if (nrules >= rline_allocated)
     {
       rline_allocated = nrules * 2;
 {
   /* Record each rule's source line number in rline table.  */
 
   if (nrules >= rline_allocated)
     {
       rline_allocated = nrules * 2;
-      rline = (short *) xrealloc (rline,
-                                rline_allocated * sizeof (short));
+      rline = (short *) xrealloc ((char *) rline,
+                                 rline_allocated * sizeof (short));
     }
   rline[nrules] = lineno;
 }
 
 
     }
   rline[nrules] = lineno;
 }
 
 
+#if 0
 /* read in a %type declaration and record its information for get_type_name to access */
 /* this is unused.  it is only called from the #if 0 part of readgram */
 static int
 /* read in a %type declaration and record its information for get_type_name to access */
 /* this is unused.  it is only called from the #if 0 part of readgram */
 static int
-get_type()
+get_type (void)
 {
   register int k;
   register int t;
 {
   register int k;
   register int t;
@@ -1788,14 +1810,14 @@ get_type()
        }
     }
 }
        }
     }
 }
-
+#endif
 
 
 /* assign symbol numbers, and write definition of token names into fdefines.
 Set up vectors tags and sprec of names and precedences of symbols.  */
 
 void
 
 
 /* assign symbol numbers, and write definition of token names into fdefines.
 Set up vectors tags and sprec of names and precedences of symbols.  */
 
 void
-packsymbols()
+packsymbols (void)
 {
   register bucket *bp;
   register int tokno = 1;
 {
   register bucket *bp;
   register int tokno = 1;
@@ -1942,8 +1964,7 @@ packsymbols()
    The value is the user token number.
 */
 void
    The value is the user token number.
 */
 void
-output_token_defines(file)
-FILE *file;
+output_token_defines (FILE *file)
 {
   bucket *bp;
   register char *cp, *symbol;
 {
   bucket *bp;
   register char *cp, *symbol;
@@ -1987,7 +2008,7 @@ FILE *file;
 /* convert the rules into the representation using rrhs, rlhs and ritems.  */
 
 void
 /* convert the rules into the representation using rrhs, rlhs and ritems.  */
 
 void
-packgram()
+packgram (void)
 {
   register int itemno;
   register int ruleno;
 {
   register int itemno;
   register int ruleno;
@@ -2048,8 +2069,7 @@ packgram()
 /* Read a signed integer from STREAM and return its value.  */
 
 int
 /* Read a signed integer from STREAM and return its value.  */
 
 int
-read_signed_integer (stream)
-     FILE *stream;
+read_signed_integer (FILE *stream)
 {
   register int c = getc(stream);
   register int sign = 1;
 {
   register int c = getc(stream);
   register int sign = 1;