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> 2009-04-20 Akim Demaille <demaille@gostai.com>
Consistently refer to Yacc, not YACC. Consistently refer to Yacc, not YACC.

View File

@@ -668,9 +668,10 @@ m4_define([b4_percent_define_default],
# b4_percent_define_if_define(VARIABLE) # b4_percent_define_if_define(VARIABLE)
# ------------------------------------- # -------------------------------------
# Define b4_VARIABLE_if that executes its $1 or $2 depending whether # 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])])]) [b4_percent_define_flag_if([$1], [$2], [$3])])])
m4_define([b4_percent_define_if_define], m4_define([b4_percent_define_if_define],
[b4_percent_define_default([[$1]], [[false]]) [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. equivalent groupings. The symbol name is used in writing grammar rules.
By convention, it should be all lower case. By convention, it should be all lower case.
Symbol names can contain letters, digits (not at the beginning), Symbol names can contain letters, underscores, period, and (not at the
underscores and periods. Periods make sense only in nonterminals. 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:

View File

@@ -1,6 +1,6 @@
/* 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. Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify 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. | | A severe error has occurred, we cannot proceed. |
`-------------------------------------------------*/ `-------------------------------------------------*/

View File

@@ -1,5 +1,5 @@
/* 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 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 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, ...) void complain_at (location loc, char const *format, ...)
__attribute__ ((__format__ (__printf__, 2, 3))); __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. */ /** A fatal error, causing immediate exit. */
void fatal (char const *format, ...) void fatal (char const *format, ...)

View File

@@ -490,9 +490,11 @@ token_definitions_output (FILE *out)
if (sym->tag[0] == '\'' || sym->tag[0] == '\"') if (sym->tag[0] == '\'' || sym->tag[0] == '\"')
continue; continue;
/* Don't #define nonliteral tokens whose names contain periods /* Don't #define nonliteral tokens whose names contain periods,
or '$' (as does the default value of the EOF token). */ dashes or '$' (as does the default value of the EOF token). */
if (strchr (sym->tag, '.') || strchr (sym->tag, '$')) if (strchr (sym->tag, '.')
|| strchr (sym->tag, '-')
|| strchr (sym->tag, '$'))
continue; continue;
fprintf (out, "%s[[[%s]], %d]", fprintf (out, "%s[[[%s]], %d]",

View File

@@ -535,15 +535,12 @@ rhs:
variable: variable:
ID ID
| STRING { $$ = uniqstr_new ($1); } /* deprecated and not M4-friendly */ | STRING { $$ = uniqstr_new ($1); }
; ;
/* Some content or empty by default. */ /* Some content or empty by default. */
content.opt: content.opt:
/* Nothing. */ /* Nothing. */ { $$ = ""; }
{
$$ = "";
}
| STRING | STRING
; ;

View File

@@ -99,8 +99,8 @@ static void unexpected_newline (boundary, char const *);
%x SC_STRING SC_CHARACTER %x SC_STRING SC_CHARACTER
letter [.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_] letter [.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_]
id {letter}({letter}|[0-9])* id {letter}({letter}|[0-9]|-)*
directive %{letter}({letter}|[0-9]|-)* directive %{id}
int [0-9]+ int [0-9]+
/* POSIX says that a tag must be both an id and a C union member, but /* 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, "'"); unexpected_eof (token_start, "'");
STRING_FINISH; STRING_FINISH;
loc->start = token_start; loc->start = token_start;
if (strlen(last_string) > 1) if (strlen (last_string) > 1)
val->character = last_string[1]; val->character = last_string[1];
else else
val->character = last_string[0]; val->character = last_string[0];

View File

@@ -1,6 +1,7 @@
/* 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. Free Software Foundation, Inc.
This file is part of Bison, the GNU Compiler Compiler. 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); symbol *res = xmalloc (sizeof *res);
uniqstr_assert (tag); 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->tag = tag;
res->location = loc; res->location = loc;