variables: accept dashes.

* src/scan-gram.l ({id}): Also accept dashes after the initial
	letter.
	({directive}): Use {id}.
	* src/parse-gram.y: Comment and formatting changes.
	* doc/bison.texinfo (Symbols): Adjust the lexical definitions of
	symbols.
	* src/complain.h, src/complain.c (yacc_at): New.
	* src/symtab.c (symbol_new): Use yacc_at to report inappropriate
	symbol names.
	* src/output.c (token_definitions_output): Do not #define token
	names with dashes.
(cherry picked from commit 4f646c3794)

Conflicts:

	data/bison.m4
	src/parse-gram.y
This commit is contained in:
Akim Demaille
2009-04-20 12:24:23 +02:00
committed by Joel E. Denny
parent 379261b3fd
commit 663ce7bb3e
10 changed files with 86 additions and 34 deletions

View File

@@ -1,3 +1,18 @@
2009-04-20 Akim Demaille <demaille@gostai.com>
variables: accept dashes.
* src/scan-gram.l ({id}): Also accept dashes after the initial
letter.
({directive}): Use {id}.
* src/parse-gram.y: Comment and formatting changes.
* doc/bison.texinfo (Symbols): Adjust the lexical definitions of
symbols.
* src/complain.h, src/complain.c (yacc_at): New.
* src/symtab.c (symbol_new): Use yacc_at to report inappropriate
symbol names.
* src/output.c (token_definitions_output): Do not #define token
names with dashes.
2009-04-24 Joel E. Denny <jdenny@ces.clemson.edu> 2009-04-24 Joel E. Denny <jdenny@ces.clemson.edu>
Clean up recent patches a little. Clean up recent patches a little.

View File

@@ -3051,8 +3051,12 @@ A @dfn{nonterminal symbol} stands for a class of syntactically
equivalent groupings. The symbol name is used in writing grammar rules. equivalent groupings. The symbol name is used in writing grammar rules.
By convention, it should be all lower case. By convention, it should be all lower case.
Symbol names can contain letters, digits (not at the beginning), Symbol names can contain letters, underscores, period, and (not at the
underscores and periods. Periods make sense only in nonterminals. beginning) digits and dashes. Dashes in symbol names are a GNU
extension, incompatible with @acronym{POSIX} Yacc. Terminal symbols
that contain periods or dashes make little sense: since they are not
valid symbols (in most programming languages) they are not exported as
token names.
There are three ways of writing terminal symbols in the grammar: There are three ways of writing terminal symbols in the grammar:

View File

@@ -1,6 +1,6 @@
/* Declaration for error-reporting function for Bison. /* Declaration for error-reporting function for Bison.
Copyright (C) 2000, 2001, 2002, 2004, 2005, 2006 Copyright (C) 2000, 2001, 2002, 2004, 2005, 2006, 2009
Free Software Foundation, Inc. Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
@@ -120,6 +120,27 @@ complain (const char *message, ...)
} }
/*--------------------------------------------------------------.
| An incompatibility with POSIX Yacc: mapped either to warn* or |
| complain* depending on yacc_flag. |
`--------------------------------------------------------------*/
void
yacc_at (location loc, const char *message, ...)
{
if (yacc_flag)
{
ERROR_MESSAGE (&loc, NULL, message);
complaint_issued = true;
}
else if (warnings_flag & warnings_yacc)
{
set_warning_issued ();
ERROR_MESSAGE (&loc, _("warning"), message);
}
}
/*-------------------------------------------------. /*-------------------------------------------------.
| A severe error has occurred, we cannot proceed. | | A severe error has occurred, we cannot proceed. |
`-------------------------------------------------*/ `-------------------------------------------------*/

View File

@@ -1,5 +1,5 @@
/* Declaration for error-reporting function for Bison. /* Declaration for error-reporting function for Bison.
Copyright (C) 2000, 2001, 2002, 2006 Free Software Foundation, Inc. Copyright (C) 2000, 2001, 2002, 2006, 2009 Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by
@@ -39,6 +39,13 @@ void complain (char const *format, ...)
void complain_at (location loc, char const *format, ...) void complain_at (location loc, char const *format, ...)
__attribute__ ((__format__ (__printf__, 2, 3))); __attribute__ ((__format__ (__printf__, 2, 3)));
/** An incompatibility with POSIX Yacc: mapped either to warn* or
complain* depending on yacc_flag. */
void yacc_at (location loc, char const *format, ...)
__attribute__ ((__format__ (__printf__, 2, 3)));
/** A fatal error, causing immediate exit. */ /** A fatal error, causing immediate exit. */
void fatal (char const *format, ...) void fatal (char const *format, ...)

View File

@@ -363,9 +363,11 @@ token_definitions_output (FILE *out)
if (sym->tag[0] == '\'' || sym->tag[0] == '\"') if (sym->tag[0] == '\'' || sym->tag[0] == '\"')
continue; continue;
/* Don't #define nonliteral tokens whose names contain periods /* Don't #define nonliteral tokens whose names contain periods,
or '$' (as does the default value of the EOF token). */ dashes or '$' (as does the default value of the EOF token). */
if (strchr (sym->tag, '.') || strchr (sym->tag, '$')) if (strchr (sym->tag, '.')
|| strchr (sym->tag, '-')
|| strchr (sym->tag, '$'))
continue; continue;
fprintf (out, "%s[[[%s]], %d]", fprintf (out, "%s[[[%s]], %d]",

View File

@@ -1,4 +1,4 @@
/* A Bison parser, made by GNU Bison 2.4.1.49-783b. */ /* A Bison parser, made by GNU Bison 2.4.1.52-77be. */
/* Skeleton implementation for Bison's Yacc-like parsers in C /* Skeleton implementation for Bison's Yacc-like parsers in C
@@ -45,7 +45,7 @@
#define YYBISON 1 #define YYBISON 1
/* Bison version. */ /* Bison version. */
#define YYBISON_VERSION "2.4.1.49-783b" #define YYBISON_VERSION "2.4.1.52-77be"
/* Skeleton name. */ /* Skeleton name. */
#define YYSKELETON_NAME "yacc.c" #define YYSKELETON_NAME "yacc.c"
@@ -672,8 +672,8 @@ static const yytype_uint16 yyrline[] =
434, 435, 440, 442, 447, 448, 452, 453, 454, 455, 434, 435, 440, 442, 447, 448, 452, 453, 454, 455,
460, 465, 470, 476, 482, 493, 494, 503, 504, 510, 460, 465, 470, 476, 482, 493, 494, 503, 504, 510,
511, 512, 519, 519, 523, 524, 525, 530, 531, 533, 511, 512, 519, 519, 523, 524, 525, 530, 531, 533,
535, 537, 539, 549, 550, 556, 559, 568, 588, 590, 535, 537, 539, 549, 550, 555, 556, 565, 585, 587,
599, 604, 605, 610, 617, 619 596, 601, 602, 607, 614, 616
}; };
#endif #endif
@@ -2551,16 +2551,14 @@ yyreduce:
case 95: case 95:
/* Line 1456 of yacc.c */ /* Line 1456 of yacc.c */
#line 556 "parse-gram.y" #line 555 "parse-gram.y"
{ { (yyval.chars) = ""; }
(yyval.chars) = "";
}
break; break;
case 97: case 97:
/* Line 1456 of yacc.c */ /* Line 1456 of yacc.c */
#line 569 "parse-gram.y" #line 566 "parse-gram.y"
{ {
code_props plain_code; code_props plain_code;
(yyvsp[(1) - (1)].code)[strlen ((yyvsp[(1) - (1)].code)) - 1] = '\n'; (yyvsp[(1) - (1)].code)[strlen ((yyvsp[(1) - (1)].code)) - 1] = '\n';
@@ -2574,14 +2572,14 @@ yyreduce:
case 98: case 98:
/* Line 1456 of yacc.c */ /* Line 1456 of yacc.c */
#line 589 "parse-gram.y" #line 586 "parse-gram.y"
{ (yyval.symbol) = symbol_from_uniqstr ((yyvsp[(1) - (1)].uniqstr), (yylsp[(1) - (1)])); } { (yyval.symbol) = symbol_from_uniqstr ((yyvsp[(1) - (1)].uniqstr), (yylsp[(1) - (1)])); }
break; break;
case 99: case 99:
/* Line 1456 of yacc.c */ /* Line 1456 of yacc.c */
#line 591 "parse-gram.y" #line 588 "parse-gram.y"
{ {
(yyval.symbol) = symbol_get (char_name ((yyvsp[(1) - (1)].character)), (yylsp[(1) - (1)])); (yyval.symbol) = symbol_get (char_name ((yyvsp[(1) - (1)].character)), (yylsp[(1) - (1)]));
symbol_class_set ((yyval.symbol), token_sym, (yylsp[(1) - (1)]), false); symbol_class_set ((yyval.symbol), token_sym, (yylsp[(1) - (1)]), false);
@@ -2592,14 +2590,14 @@ yyreduce:
case 100: case 100:
/* Line 1456 of yacc.c */ /* Line 1456 of yacc.c */
#line 599 "parse-gram.y" #line 596 "parse-gram.y"
{ (yyval.symbol) = symbol_from_uniqstr ((yyvsp[(1) - (1)].uniqstr), (yylsp[(1) - (1)])); } { (yyval.symbol) = symbol_from_uniqstr ((yyvsp[(1) - (1)].uniqstr), (yylsp[(1) - (1)])); }
break; break;
case 103: case 103:
/* Line 1456 of yacc.c */ /* Line 1456 of yacc.c */
#line 611 "parse-gram.y" #line 608 "parse-gram.y"
{ {
(yyval.symbol) = symbol_get (quotearg_style (c_quoting_style, (yyvsp[(1) - (1)].chars)), (yylsp[(1) - (1)])); (yyval.symbol) = symbol_get (quotearg_style (c_quoting_style, (yyvsp[(1) - (1)].chars)), (yylsp[(1) - (1)]));
symbol_class_set ((yyval.symbol), token_sym, (yylsp[(1) - (1)]), false); symbol_class_set ((yyval.symbol), token_sym, (yylsp[(1) - (1)]), false);
@@ -2609,7 +2607,7 @@ yyreduce:
case 105: case 105:
/* Line 1456 of yacc.c */ /* Line 1456 of yacc.c */
#line 620 "parse-gram.y" #line 617 "parse-gram.y"
{ {
code_props plain_code; code_props plain_code;
code_props_plain_init (&plain_code, (yyvsp[(2) - (2)].chars), (yylsp[(2) - (2)])); code_props_plain_init (&plain_code, (yyvsp[(2) - (2)].chars), (yylsp[(2) - (2)]));
@@ -2623,7 +2621,7 @@ yyreduce:
/* Line 1456 of yacc.c */ /* Line 1456 of yacc.c */
#line 2627 "parse-gram.c" #line 2625 "parse-gram.c"
default: break; default: break;
} }
YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
@@ -2842,7 +2840,7 @@ yyreturn:
/* Line 1676 of yacc.c */ /* Line 1676 of yacc.c */
#line 630 "parse-gram.y" #line 627 "parse-gram.y"

View File

@@ -1,4 +1,4 @@
/* A Bison parser, made by GNU Bison 2.4.1.49-783b. */ /* A Bison parser, made by GNU Bison 2.4.1.52-77be. */
/* Skeleton interface for Bison's Yacc-like parsers in C /* Skeleton interface for Bison's Yacc-like parsers in C

View File

@@ -547,15 +547,12 @@ rhs:
variable: variable:
ID ID
| STRING { $$ = uniqstr_new ($1); } /* deprecated and not M4-friendly */ | STRING { $$ = uniqstr_new ($1); }
; ;
/* Some content or empty by default. */ /* Some content or empty by default. */
content.opt: content.opt:
/* Nothing. */ /* Nothing. */ { $$ = ""; }
{
$$ = "";
}
| STRING | STRING
; ;

View File

@@ -90,8 +90,8 @@ static void unexpected_newline (boundary, char const *);
%x SC_STRING SC_CHARACTER %x SC_STRING SC_CHARACTER
letter [.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_] letter [.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_]
id {letter}({letter}|[0-9])* id {letter}({letter}|[0-9]|-)*
directive %{letter}({letter}|[0-9]|-)* directive %{id}
int [0-9]+ int [0-9]+
/* POSIX says that a tag must be both an id and a C union member, but /* POSIX says that a tag must be both an id and a C union member, but
@@ -382,7 +382,7 @@ splice (\\[ \f\t\v]*\n)*
unexpected_eof (token_start, "'"); unexpected_eof (token_start, "'");
STRING_FINISH; STRING_FINISH;
loc->start = token_start; loc->start = token_start;
if (strlen(last_string) > 1) if (strlen (last_string) > 1)
val->character = last_string[1]; val->character = last_string[1];
else else
val->character = last_string[0]; val->character = last_string[0];

View File

@@ -1,6 +1,7 @@
/* Symbol table manager for Bison. /* Symbol table manager for Bison.
Copyright (C) 1984, 1989, 2000, 2001, 2002, 2004, 2005, 2006, 2007, 2008 Copyright (C) 1984, 1989, 2000, 2001, 2002, 2004, 2005, 2006, 2007,
2008, 2009
Free Software Foundation, Inc. Free Software Foundation, Inc.
This file is part of Bison, the GNU Compiler Compiler. This file is part of Bison, the GNU Compiler Compiler.
@@ -58,6 +59,13 @@ symbol_new (uniqstr tag, location loc)
symbol *res = xmalloc (sizeof *res); symbol *res = xmalloc (sizeof *res);
uniqstr_assert (tag); uniqstr_assert (tag);
/* If the tag is not a string (starts with a double quote), check
that it is valid for Yacc. */
if (tag[0] != '\"' && tag[0] != '\'' && strchr (tag, '-'))
yacc_at (loc, _("POSIX Yacc forbids dashes in symbol names: %s"),
tag);
res->tag = tag; res->tag = tag;
res->location = loc; res->location = loc;