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.
This commit is contained in:
Akim Demaille
2009-04-20 12:24:23 +02:00
parent 184e317956
commit 4f646c3794
9 changed files with 75 additions and 18 deletions

View File

@@ -1,3 +1,20 @@
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.

View File

@@ -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]])

View File

@@ -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:

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

@@ -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]",

View File

@@ -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
;

View File

@@ -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];

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;