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>
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.
By convention, it should be all lower case.
Symbol names can contain letters, digits (not at the beginning),
underscores and periods. Periods make sense only in nonterminals.
Symbol names can contain letters, underscores, period, and (not at the
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:

View File

@@ -1,6 +1,6 @@
/* 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.
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. |
`-------------------------------------------------*/

View File

@@ -1,5 +1,5 @@
/* 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
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, ...)
__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. */
void fatal (char const *format, ...)

View File

@@ -363,9 +363,11 @@ token_definitions_output (FILE *out)
if (sym->tag[0] == '\'' || sym->tag[0] == '\"')
continue;
/* Don't #define nonliteral tokens whose names contain periods
or '$' (as does the default value of the EOF token). */
if (strchr (sym->tag, '.') || strchr (sym->tag, '$'))
/* Don't #define nonliteral tokens whose names contain periods,
dashes or '$' (as does the default value of the EOF token). */
if (strchr (sym->tag, '.')
|| strchr (sym->tag, '-')
|| strchr (sym->tag, '$'))
continue;
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
@@ -45,7 +45,7 @@
#define YYBISON 1
/* Bison version. */
#define YYBISON_VERSION "2.4.1.49-783b"
#define YYBISON_VERSION "2.4.1.52-77be"
/* Skeleton name. */
#define YYSKELETON_NAME "yacc.c"
@@ -672,8 +672,8 @@ static const yytype_uint16 yyrline[] =
434, 435, 440, 442, 447, 448, 452, 453, 454, 455,
460, 465, 470, 476, 482, 493, 494, 503, 504, 510,
511, 512, 519, 519, 523, 524, 525, 530, 531, 533,
535, 537, 539, 549, 550, 556, 559, 568, 588, 590,
599, 604, 605, 610, 617, 619
535, 537, 539, 549, 550, 555, 556, 565, 585, 587,
596, 601, 602, 607, 614, 616
};
#endif
@@ -2551,16 +2551,14 @@ yyreduce:
case 95:
/* Line 1456 of yacc.c */
#line 556 "parse-gram.y"
{
(yyval.chars) = "";
}
#line 555 "parse-gram.y"
{ (yyval.chars) = ""; }
break;
case 97:
/* Line 1456 of yacc.c */
#line 569 "parse-gram.y"
#line 566 "parse-gram.y"
{
code_props plain_code;
(yyvsp[(1) - (1)].code)[strlen ((yyvsp[(1) - (1)].code)) - 1] = '\n';
@@ -2574,14 +2572,14 @@ yyreduce:
case 98:
/* 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)])); }
break;
case 99:
/* 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)]));
symbol_class_set ((yyval.symbol), token_sym, (yylsp[(1) - (1)]), false);
@@ -2592,14 +2590,14 @@ yyreduce:
case 100:
/* 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)])); }
break;
case 103:
/* 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)]));
symbol_class_set ((yyval.symbol), token_sym, (yylsp[(1) - (1)]), false);
@@ -2609,7 +2607,7 @@ yyreduce:
case 105:
/* Line 1456 of yacc.c */
#line 620 "parse-gram.y"
#line 617 "parse-gram.y"
{
code_props plain_code;
code_props_plain_init (&plain_code, (yyvsp[(2) - (2)].chars), (yylsp[(2) - (2)]));
@@ -2623,7 +2621,7 @@ yyreduce:
/* Line 1456 of yacc.c */
#line 2627 "parse-gram.c"
#line 2625 "parse-gram.c"
default: break;
}
YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
@@ -2842,7 +2840,7 @@ yyreturn:
/* 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

View File

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

View File

@@ -90,8 +90,8 @@ static void unexpected_newline (boundary, char const *);
%x SC_STRING SC_CHARACTER
letter [.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_]
id {letter}({letter}|[0-9])*
directive %{letter}({letter}|[0-9]|-)*
id {letter}({letter}|[0-9]|-)*
directive %{id}
int [0-9]+
/* 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, "'");
STRING_FINISH;
loc->start = token_start;
if (strlen(last_string) > 1)
if (strlen (last_string) > 1)
val->character = last_string[1];
else
val->character = last_string[0];

View File

@@ -1,6 +1,7 @@
/* 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.
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);
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->location = loc;