From 4f646c3794c45940aaf96d5409eff02a2c74978e Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Mon, 20 Apr 2009 12:24:23 +0200 Subject: [PATCH 1/3] variables: accept dashes. * data/bison.m4 (b4_percent_define_if_define_): Also map dashes to underscores. * 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. --- ChangeLog | 17 +++++++++++++++++ data/bison.m4 | 5 +++-- doc/bison.texinfo | 8 ++++++-- src/complain.c | 23 ++++++++++++++++++++++- src/complain.h | 9 ++++++++- src/output.c | 8 +++++--- src/parse-gram.y | 7 ++----- src/scan-gram.l | 6 +++--- src/symtab.c | 10 +++++++++- 9 files changed, 75 insertions(+), 18 deletions(-) diff --git a/ChangeLog b/ChangeLog index ff36a34..b8a5748 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,22 @@ 2009-04-20 Akim Demaille + variables: accept dashes. + * data/bison.m4 (b4_percent_define_if_define_): Also map dashes to + underscores. + * 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-20 Akim Demaille + Consistently refer to Yacc, not YACC. * src/getargs.c (usage, warnings_args): s/YACC/Yacc/. diff --git a/data/bison.m4 b/data/bison.m4 index 2b4e504..384f875 100644 --- a/data/bison.m4 +++ b/data/bison.m4 @@ -668,9 +668,10 @@ m4_define([b4_percent_define_default], # b4_percent_define_if_define(VARIABLE) # ------------------------------------- # Define b4_VARIABLE_if that executes its $1 or $2 depending whether -# VARIABLE was %defined. The character `.' in VARIABLE is mapped to `_'. +# VARIABLE was %defined. The characters `.' and `-' in VARIABLE are mapped +# to `_'. m4_define([b4_percent_define_if_define_], -[m4_define(m4_bpatsubst([b4_$1_if], [[.]], [_]), +[m4_define(m4_bpatsubst([b4_$1_if], [[-.]], [_]), [b4_percent_define_flag_if([$1], [$2], [$3])])]) m4_define([b4_percent_define_if_define], [b4_percent_define_default([[$1]], [[false]]) diff --git a/doc/bison.texinfo b/doc/bison.texinfo index fbe9ac9..a3a85a2 100644 --- a/doc/bison.texinfo +++ b/doc/bison.texinfo @@ -3053,8 +3053,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 2c26c4e..4cc35c8 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 a633613..89cdd91 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 1220446..0a08fc4 100644 --- a/src/output.c +++ b/src/output.c @@ -490,9 +490,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.y b/src/parse-gram.y index 20dee8c..caa3d30 100644 --- a/src/parse-gram.y +++ b/src/parse-gram.y @@ -535,15 +535,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 478d096..bc7592e 100644 --- a/src/scan-gram.l +++ b/src/scan-gram.l @@ -99,8 +99,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 @@ -411,7 +411,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 b65bdd4..c956e72 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; -- 1.6.2.2