From b7c49edf135cea5dc2bd0942b42d28e6c84cf71f Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Thu, 27 Dec 2001 18:13:09 +0000 Subject: [PATCH] * src/main.c (main): If there are complains after grammar reductions, then output the report anyway if requested, then die. * src/symtab.c (bucket_new): Initialize `value' to -1, not 0. * src/reader.c (eoftoken): New. (parse_token_decl): If the token being defined has value `0', it is the eoftoken. (packsymbols): No longer hack `tags' to insert `$' by hand. Be sure to preserve the value of the eoftoken. (reader): Make sure eoftoken is defined. Initialize nsyms to 0: now eoftoken is created just like the others. * src/print.c (print_grammar): Don't special case the eof token. * src/regression.at: Adjust: `$' has value 0, not -1, which was a lie anyway, albeit pleasant. * tests/calc.at: Exercise error messages with eoftoken. Change the grammar so that empty input is invalid. Adjust expectations. When yyungeting, be sure to use a valid yylloc: use last_yylloc. --- ChangeLog | 21 ++++++++++++++++ NEWS | 10 +++++++- src/main.c | 8 +++--- src/print.c | 2 -- src/reader.c | 61 +++++++++++++++++++++++++++++---------------- src/symtab.c | 2 +- tests/calc.at | 49 +++++++++++++++++++++++------------- tests/regression.at | 8 +++--- 8 files changed, 111 insertions(+), 50 deletions(-) diff --git a/ChangeLog b/ChangeLog index 6a336673..4fd250f0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,24 @@ +2001-12-27 Akim Demaille + + * src/main.c (main): If there are complains after grammar + reductions, then output the report anyway if requested, then die. + * src/symtab.c (bucket_new): Initialize `value' to -1, not 0. + * src/reader.c (eoftoken): New. + (parse_token_decl): If the token being defined has value `0', it + is the eoftoken. + (packsymbols): No longer hack `tags' to insert `$' by hand. + Be sure to preserve the value of the eoftoken. + (reader): Make sure eoftoken is defined. + Initialize nsyms to 0: now eoftoken is created just like the others. + * src/print.c (print_grammar): Don't special case the eof token. + * src/regression.at: Adjust: `$' has value 0, not -1, which was a + lie anyway, albeit pleasant. + * tests/calc.at: Exercise error messages with eoftoken. + Change the grammar so that empty input is invalid. + Adjust expectations. + When yyungeting, be sure to use a valid yylloc: use last_yylloc. + + 2001-12-27 Akim Demaille * configure.in: Check the protos of strchr ans strspn. diff --git a/NEWS b/NEWS index 9d6e4065..61081a44 100644 --- a/NEWS +++ b/NEWS @@ -3,10 +3,18 @@ Bison News Changes in version 1.49a: -* items overflow +* Items overflow Bison no longer dumps core when there are too many items, it just dies. +* Token end-of-file + The token end of file may be specified by the user, in which case, + the user symbol is used in the reports, the graphs, and the verbose + error messages instead of `$', which remains being the defaults. + For instance + %token YYEOF 0 + or + %token YYEOF 0 "end of file" Changes in version 1.30: diff --git a/src/main.c b/src/main.c index 28b08e18..55dca624 100644 --- a/src/main.c +++ b/src/main.c @@ -86,15 +86,15 @@ main (int argc, char *argv[]) /* Output file names. */ compute_output_file_names (); + /* Output the detailed report on the grammar. */ + if (verbose_flag) + print_results (); + /* Stop if there were errors, to avoid trashing previous output files. */ if (complain_message_count) exit (1); - /* Output the detailed report on the grammar. */ - if (verbose_flag) - print_results (); - /* Output the VCG graph. */ if (graph_flag) print_graph (); diff --git a/src/print.c b/src/print.c index 648e3e6c..6c0002cd 100644 --- a/src/print.c +++ b/src/print.c @@ -389,8 +389,6 @@ print_grammar (FILE *out) /* TERMINAL (type #) : rule #s terminal is on RHS */ fprintf (out, "%s\n\n", _("Terminals, with rules where they appear")); - fprintf (out, "%s (-1)\n", escape (tags[0])); - for (i = 0; i <= max_user_token_number; i++) if (token_translations[i] != 2) { diff --git a/src/reader.c b/src/reader.c index b7fce299..c5f3b11e 100644 --- a/src/reader.c +++ b/src/reader.c @@ -68,9 +68,9 @@ static int typed; /* Incremented for each %left, %right or %nonassoc seen */ static int lastprec; -static bucket *errtoken; -static bucket *undeftoken; - +static bucket *errtoken = NULL; +static bucket *undeftoken = NULL; +static bucket *eoftoken = NULL; static symbol_list * symbol_list_new (bucket *sym) @@ -441,7 +441,7 @@ copy_definition (void) { obstack_fgrow2 (&attrs_obstack, muscle_find ("linef"), lineno, quotearg_style (c_quoting_style, - muscle_find("filename"))); + muscle_find ("filename"))); } after_percent = 0; @@ -573,6 +573,9 @@ parse_token_decl (symbol_class what_is, symbol_class what_is_not) else if (symbol && token == tok_number) { symbol->user_token_number = numval; + /* User defined EOF token? */ + if (numval == 0) + eoftoken = symbol; } else { @@ -902,8 +905,8 @@ static void parse_muscle_decl (void) { int ch = ungetc (skip_white_space (), finput); - char* muscle_key; - char* muscle_value; + char *muscle_key; + char *muscle_value; /* Read key. */ if (!isalpha (ch) && ch != '_') @@ -1486,7 +1489,7 @@ read_additionnal_code (void) { obstack_fgrow2 (&el_obstack, muscle_find ("linef"), lineno, quotearg_style (c_quoting_style, - muscle_find("filename"))); + muscle_find ("filename"))); } while ((c = getc (finput)) != EOF) @@ -1549,7 +1552,6 @@ packsymbols (void) bucket *bp = NULL; int tokno = 1; int last_user_token_number; - static char DOLLAR[] = "$"; tags = XCALLOC (char *, nsyms + 1); user_toknums = XCALLOC (short, nsyms + 1); @@ -1557,10 +1559,6 @@ packsymbols (void) sprec = XCALLOC (short, nsyms); sassoc = XCALLOC (short, nsyms); - /* The EOF token. */ - tags[0] = DOLLAR; - user_toknums[0] = 0; - max_user_token_number = 256; last_user_token_number = 256; @@ -1572,11 +1570,18 @@ packsymbols (void) } else if (bp->alias) { - /* this symbol and its alias are a single token defn. - allocate a tokno, and assign to both check agreement of - ->prec and ->assoc fields and make both the same */ - if (bp->value == 0) - bp->value = bp->alias->value = tokno++; + /* This symbol and its alias are a single token defn. + Allocate a tokno, and assign to both check agreement of + prec and assoc fields and make both the same */ + if (bp->value == -1) + { + if (bp == eoftoken || bp->alias == eoftoken) + bp->value = bp->alias->value = 0; + else + { + bp->value = bp->alias->value = tokno++; + } + } if (bp->prec != bp->alias->prec) { @@ -1602,13 +1607,17 @@ packsymbols (void) bp->assoc = bp->alias->assoc; } + /* Do not do processing below for SALIASs. */ if (bp->user_token_number == SALIAS) - continue; /* do not do processing below for SALIASs */ + continue; } - else /* bp->class == token_sym */ + else /* bp->class == token_sym */ { - bp->value = tokno++; + if (bp == eoftoken) + bp->value = 0; + else + bp->value = tokno++; } if (bp->class == token_sym) @@ -1774,7 +1783,7 @@ reader (void) start_flag = 0; startval = NULL; /* start symbol not specified yet. */ - nsyms = 1; + nsyms = 0; nvars = 0; nrules = 0; nitems = 0; @@ -1818,6 +1827,16 @@ reader (void) TABLE_OBSTACK and FDEFINES file. Also notice any %token, %left, etc. found there. */ read_declarations (); + + /* If the user did not define her EOFTOKEN, do it now. */ + if (!eoftoken) + { + eoftoken = getsym ("$"); + eoftoken->class = token_sym; + /* Value specified by POSIX. */ + eoftoken->user_token_number = 0; + } + /* Read in the grammar, build grammar in list form. Write out guards and actions. */ readgram (); diff --git a/src/symtab.c b/src/symtab.c index 455e74e2..57ef636e 100644 --- a/src/symtab.c +++ b/src/symtab.c @@ -55,7 +55,7 @@ bucket_new (const char *tag, int hashval) res->next = NULL; res->tag = xstrdup (tag); res->type_name = NULL; - res->value = 0; + res->value = -1; res->prec = 0; res->assoc = right_assoc; res->user_token_number = SUNDEF; diff --git a/tests/calc.at b/tests/calc.at index 5fa17f44..49cf4e23 100644 --- a/tests/calc.at +++ b/tests/calc.at @@ -64,8 +64,8 @@ extern void perror (const char *s); %} /* Bison Declarations */ -%token CALC_EOF 0 -%token NUM +%token CALC_EOF 0 "end of file" +%token NUM "number" %nonassoc '=' /* comparison */ %left '-' '+' @@ -78,7 +78,7 @@ extern void perror (const char *s); /* Grammar follows */ %% input: - /* empty string */ + line | input line ; @@ -118,11 +118,16 @@ yyerror (const char *s) fprintf (stderr, "%s\n", s); } + +#if YYLSP_NEEDED +static YYLTYPE last_yylloc; +#endif static int yygetc (void) { int res = getc (yyin); #if YYLSP_NEEDED + last_yylloc = yylloc; if (res == '\n') { yylloc.last_line++; @@ -140,7 +145,7 @@ yyungetc (int c) { #if YYLSP_NEEDED /* Wrong when C == `\n'. */ - yylloc.last_column--; + yylloc = last_yylloc; #endif ungetc (c, yyin); } @@ -286,6 +291,9 @@ AT_CHECK([wc -l /* empty */ 5 15 CONST_DEC -> @1 undef_id_tok '=' const_id_tok ';' Terminals, with rules where they appear -$ (-1) +$ (0) ';' (59) 5 '=' (61) 5 error (256) -- 2.45.2