* 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.
("'"<SC_ESCAPED_CHARACTER>): 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.
This commit is contained in:
Paul Eggert
2005-04-16 06:32:51 +00:00
parent 506ffb1f74
commit ca407bdf9d
5 changed files with 63 additions and 17 deletions

View File

@@ -1,3 +1,25 @@
2005-04-15 Paul Eggert <eggert@cs.ucla.edu>
* 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.
("'"<SC_ESCAPED_CHARACTER>): 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 <eggert@cs.ucla.edu>
* NEWS: Bison-generated C parsers now use the _ macro to

View File

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

View File

@@ -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)*
<SC_ESCAPED_STRING>
{
"\"" {
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);

View File

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

View File

@@ -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 <stdio.h>
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