+2009-04-20 Akim Demaille <demaille@gostai.com>
+
+ 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 <demaille@gostai.com>
Consistently refer to Yacc, not YACC.
# 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]])
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:
/* 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
}
+/*--------------------------------------------------------------.
+| 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. |
`-------------------------------------------------*/
/* 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
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, ...)
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]",
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
;
%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
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];
/* 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.
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;