From ca407bdf9db2d435ca1a4a257b158632d1cb4842 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Sat, 16 Apr 2005 06:32:51 +0000 Subject: [PATCH] * src/parse-gram.y: Include quotearg.h. (string_as_id): Quote $1 before using it as a key, since the lexer no longer quotes it for us. (string_content): Don't strip quotes, since lexer no longer quotes it for us. * src/scan-gram.l: Include quotearg.h. ("\""): Omit quote. ("'"): Quote symbol before using it as a key, since the rest of the lexer doesn't quote it. * src/symtab.c (symbol_get): Don't quote symbol; caller does it now. * tests/regression.at (Token definitions): Check for backslashes in token strings. --- ChangeLog | 22 ++++++++++++++++++++++ src/parse-gram.y | 17 ++++++++--------- src/scan-gram.l | 8 +++++--- src/symtab.c | 3 +-- tests/regression.at | 30 +++++++++++++++++++++++++++--- 5 files changed, 63 insertions(+), 17 deletions(-) diff --git a/ChangeLog b/ChangeLog index 0737249a..4a999f6a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,25 @@ +2005-04-15 Paul Eggert + + * src/parse-gram.y: Include quotearg.h. + (string_as_id): Quote $1 before using it as a key, since the + lexer no longer quotes it for us. + (string_content): Don't strip quotes, since lexer no longer + quotes it for us. + * src/scan-gram.l: Include quotearg.h. + ("\""): Omit quote. + ("'"): Quote symbol before using it as + a key, since the rest of the lexer doesn't quote it. + * src/symtab.c (symbol_get): Don't quote symbol; caller does it now. + * tests/regression.at (Token definitions): Check for backslashes + in token strings. + + * data/yacc.c (YYSTACK_ALLOC_MAXIMUM): New macro. + (YYSIZE_T): Define to unsigned long int when using an older compiler. + (yyparse): Revamp code to generate long syntax error message, to + make it easier to translate, and to avoid problems with arithmetic + overflow. Change "virtual memory" to "memory" in diagnostic, since + we don't know whether the memory is virtual. + 2005-04-13 Paul Eggert * NEWS: Bison-generated C parsers now use the _ macro to diff --git a/src/parse-gram.y b/src/parse-gram.y index 6016cea7..cecde65e 100644 --- a/src/parse-gram.y +++ b/src/parse-gram.y @@ -1,6 +1,6 @@ %{/* Bison Grammar Parser -*- C -*- - Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc. + Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc. This file is part of Bison, the GNU Compiler Compiler. @@ -29,6 +29,7 @@ #include "gram.h" #include "muscle_tab.h" #include "output.h" +#include "quotearg.h" #include "reader.h" #include "symlist.h" @@ -403,25 +404,23 @@ symbol: action: BRACED_CODE - { $$ = $1; } + { $$ = $1; } ; -/* A string used as an ID: we have to keep the quotes. */ +/* A string used as an ID: quote it. */ string_as_id: STRING { - $$ = symbol_get ($1, @1); + $$ = symbol_get (quotearg_style (c_quoting_style, $1), @1); symbol_class_set ($$, token_sym, @1); } ; -/* A string used for its contents. Strip the quotes. */ +/* A string used for its contents. Don't quote it. */ string_content: STRING - { - $$ = $1 + 1; - $$[strlen ($$) - 1] = '\0'; - }; + { $$ = $1; } +; epilogue.opt: diff --git a/src/scan-gram.l b/src/scan-gram.l index adf97616..9fc1dcb4 100644 --- a/src/scan-gram.l +++ b/src/scan-gram.l @@ -34,6 +34,7 @@ #include "files.h" #include "getargs.h" #include "gram.h" +#include "quotearg.h" #include "reader.h" #include "uniqstr.h" @@ -249,7 +250,7 @@ splice (\\[ \f\t\v]*\n)* "'" STRING_GROW; token_start = loc->start; BEGIN SC_ESCAPED_CHARACTER; /* Strings. */ - "\"" STRING_GROW; token_start = loc->start; BEGIN SC_ESCAPED_STRING; + "\"" token_start = loc->start; BEGIN SC_ESCAPED_STRING; /* Prologue. */ "%{" code_start = loc->start; BEGIN SC_PROLOGUE; @@ -360,7 +361,6 @@ splice (\\[ \f\t\v]*\n)* { "\"" { - STRING_GROW; STRING_FINISH; loc->start = token_start; val->chars = last_string; @@ -384,7 +384,9 @@ splice (\\[ \f\t\v]*\n)* STRING_GROW; STRING_FINISH; loc->start = token_start; - val->symbol = symbol_get (last_string, *loc); + val->symbol = symbol_get (quotearg_style (escape_quoting_style, + last_string), + *loc); symbol_class_set (val->symbol, token_sym, *loc); last_string_1 = last_string[1]; symbol_user_token_number_set (val->symbol, last_string_1, *loc); diff --git a/src/symtab.c b/src/symtab.c index 223229fa..3b5683a2 100644 --- a/src/symtab.c +++ b/src/symtab.c @@ -475,8 +475,7 @@ symbol_get (const char *key, location loc) symbol probe; symbol *entry; - /* Keep the symbol in a printable form. */ - key = uniqstr_new (quotearg_style (escape_quoting_style, key)); + key = uniqstr_new (key); probe.tag = key; entry = hash_lookup (symbol_table, &probe); diff --git a/tests/regression.at b/tests/regression.at index dd87ef2d..3d67ee9d 100644 --- a/tests/regression.at +++ b/tests/regression.at @@ -314,20 +314,44 @@ AT_SETUP([Token definitions]) # Bison managed, when fed with `%token 'f' "f"' to #define 'f'! AT_DATA_GRAMMAR([input.y], [%{ +#include void yyerror (const char *s); int yylex (void); %} -[%token MYEOF 0 "end of file" +[%error-verbose +%token MYEOF 0 "end of file" %token 'a' "a" %token B_TOKEN "b" %token C_TOKEN 'c' %token 'd' D_TOKEN +%token SPECIAL "\\\'\?\"\a\b\f\n\r\t\v\001\377\x001\x0000ff" %% -exp: "a"; +exp: "a" "\\\'\?\"\a\b\f\n\r\t\v\001\377\x001\x0000ff"; +%% +void +yyerror (char const *s) +{ + fprintf (stderr, "%s\n", s); +} + +int +yylex (void) +{ + return SPECIAL; +} + +int +main (void) +{ + return yyparse (); +} ]]) AT_CHECK([bison -o input.c input.y]) -AT_COMPILE([input.o], [-c input.c]) +AT_COMPILE([input]) +AT_PARSER_CHECK([./input], 1, [], +[syntax error, unexpected "\\'?\"\a\b\f\n\r\t\v\001\377\001\377", expecting "a" +]) AT_CLEANUP -- 2.45.2