* 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>
+
+ 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.
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
# 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([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]])
[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.
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:
There are three ways of writing terminal symbols in the grammar:
/* 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.
This program is free software: you can redistribute it and/or modify
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. |
`-------------------------------------------------*/
/*-------------------------------------------------.
| A severe error has occurred, we cannot proceed. |
`-------------------------------------------------*/
/* 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
it under the terms of the GNU General Public License as published by
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)));
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, ...)
/** A fatal error, causing immediate exit. */
void fatal (char const *format, ...)
if (sym->tag[0] == '\'' || sym->tag[0] == '\"')
continue;
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]",
continue;
fprintf (out, "%s[[[%s]], %d]",
-| STRING { $$ = uniqstr_new ($1); } /* deprecated and not M4-friendly */
+| STRING { $$ = uniqstr_new ($1); }
;
/* Some content or empty by default. */
content.opt:
;
/* Some content or empty by default. */
content.opt:
- /* Nothing. */
- {
- $$ = "";
- }
+ /* Nothing. */ { $$ = ""; }
%x SC_STRING SC_CHARACTER
letter [.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_]
%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
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;
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];
val->character = last_string[1];
else
val->character = last_string[0];
/* 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.
This file is part of Bison, the GNU Compiler Compiler.
Free Software Foundation, Inc.
This file is part of Bison, the GNU Compiler Compiler.
symbol *res = xmalloc (sizeof *res);
uniqstr_assert (tag);
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;
res->tag = tag;
res->location = loc;