From 663ce7bb3e7e325eaa321f22509e6163f1bec4e2 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Mon, 20 Apr 2009 12:24:23 +0200 Subject: [PATCH] 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 4f646c3794c45940aaf96d5409eff02a2c74978e) Conflicts: data/bison.m4 src/parse-gram.y --- ChangeLog | 15 +++++++++++++++ doc/bison.texinfo | 8 ++++++-- src/complain.c | 23 ++++++++++++++++++++++- src/complain.h | 9 ++++++++- src/output.c | 8 +++++--- src/parse-gram.c | 30 ++++++++++++++---------------- src/parse-gram.h | 2 +- src/parse-gram.y | 9 +++------ src/scan-gram.l | 6 +++--- src/symtab.c | 10 +++++++++- 10 files changed, 86 insertions(+), 34 deletions(-) diff --git a/ChangeLog b/ChangeLog index b42a91d0..69edc6bd 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,18 @@ +2009-04-20 Akim Demaille + + 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 Clean up recent patches a little. diff --git a/doc/bison.texinfo b/doc/bison.texinfo index c52d7b8a..46c95f01 100644 --- a/doc/bison.texinfo +++ b/doc/bison.texinfo @@ -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: diff --git a/src/complain.c b/src/complain.c index 2c26c4e4..4cc35c8a 100644 --- a/src/complain.c +++ b/src/complain.c @@ -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. | `-------------------------------------------------*/ diff --git a/src/complain.h b/src/complain.h index a633613c..89cdd91d 100644 --- a/src/complain.h +++ b/src/complain.h @@ -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, ...) diff --git a/src/output.c b/src/output.c index f7251473..e299230b 100644 --- a/src/output.c +++ b/src/output.c @@ -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]", diff --git a/src/parse-gram.c b/src/parse-gram.c index acae131b..38e64d61 100644 --- a/src/parse-gram.c +++ b/src/parse-gram.c @@ -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" diff --git a/src/parse-gram.h b/src/parse-gram.h index ae82cd45..fecb9199 100644 --- a/src/parse-gram.h +++ b/src/parse-gram.h @@ -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 diff --git a/src/parse-gram.y b/src/parse-gram.y index 83b02e36..2e4168b7 100644 --- a/src/parse-gram.y +++ b/src/parse-gram.y @@ -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 ; diff --git a/src/scan-gram.l b/src/scan-gram.l index 292960cb..2ef4eb3b 100644 --- a/src/scan-gram.l +++ b/src/scan-gram.l @@ -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]; diff --git a/src/symtab.c b/src/symtab.c index 1db83f63..f9560efa 100644 --- a/src/symtab.c +++ b/src/symtab.c @@ -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; -- 2.47.2