mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-18 16:53:02 +00:00
muscle: enforce definition syntax for keyword variables
* src/muscle-tab.c (muscle_percent_define_get_kind) (muscle_percent_define_check_kind): New. (muscle_percent_define_default): Variables with a default value are of "keyword" kind. (muscle_percent_define_flag_if, muscle_percent_define_check_values): Check that the variable is of keyword kind. * data/bison.m4: Likewise, but in M4. That is to say... (b4_percent_define_default): Define the kind when the variable is undefined. (b4_percent_define_check_kind): Use a better error message. (_b4_percent_define_check_values, _b4_percent_define_check_values): Former "enum" variables should be defined using the keyword syntax. * doc/bison.texi: Update. A couple of fixes. * tests/input.at (%define keyword variables): New.
This commit is contained in:
@@ -814,8 +814,8 @@ m4_define([b4_percent_define_flag_if],
|
|||||||
[b4_fatal([[$0: undefined %%define variable '%s']], [$1])])])
|
[b4_fatal([[$0: undefined %%define variable '%s']], [$1])])])
|
||||||
|
|
||||||
|
|
||||||
# b4_percent_define_default(VARIABLE, DEFAULT)
|
# b4_percent_define_default(VARIABLE, DEFAULT, [KIND = keyword])
|
||||||
# --------------------------------------------
|
# --------------------------------------------------------------
|
||||||
# Mimic muscle_percent_define_default in ../src/muscle-tab.h exactly. That is,
|
# Mimic muscle_percent_define_default in ../src/muscle-tab.h exactly. That is,
|
||||||
# if the %define variable VARIABLE is undefined, set its value to DEFAULT.
|
# if the %define variable VARIABLE is undefined, set its value to DEFAULT.
|
||||||
# Don't record this as a Bison usage of VARIABLE as there's no reason to
|
# Don't record this as a Bison usage of VARIABLE as there's no reason to
|
||||||
@@ -827,6 +827,8 @@ m4_define([b4_percent_define_flag_if],
|
|||||||
m4_define([b4_percent_define_default],
|
m4_define([b4_percent_define_default],
|
||||||
[b4_percent_define_ifdef_([$1], [],
|
[b4_percent_define_ifdef_([$1], [],
|
||||||
[m4_define([b4_percent_define(]$1[)], [$2])dnl
|
[m4_define([b4_percent_define(]$1[)], [$2])dnl
|
||||||
|
m4_define([b4_percent_define_kind(]$1[)],
|
||||||
|
[m4_default([$3], [keyword])])dnl
|
||||||
m4_define([b4_percent_define_loc(]$1[)],
|
m4_define([b4_percent_define_loc(]$1[)],
|
||||||
[[[[<skeleton default value>:-1.-1]],
|
[[[[<skeleton default value>:-1.-1]],
|
||||||
[[<skeleton default value>:-1.-1]]]])dnl
|
[[<skeleton default value>:-1.-1]]]])dnl
|
||||||
@@ -856,7 +858,7 @@ m4_define([b4_percent_define_check_kind],
|
|||||||
b4_percent_define_get_loc([$1]),
|
b4_percent_define_get_loc([$1]),
|
||||||
[m4_case([$2],
|
[m4_case([$2],
|
||||||
[code], [[%%define variable '%s' requires '{...}' values]],
|
[code], [[%%define variable '%s' requires '{...}' values]],
|
||||||
[keyword], [[%%define variable '%s' requires '...' values]],
|
[keyword], [[%%define variable '%s' requires keyword values]],
|
||||||
[string], [[%%define variable '%s' requires '"..."' values]])],
|
[string], [[%%define variable '%s' requires '"..."' values]])],
|
||||||
[$1])])])dnl
|
[$1])])])dnl
|
||||||
])
|
])
|
||||||
@@ -884,7 +886,8 @@ m4_define([b4_percent_define_check_values],
|
|||||||
|
|
||||||
m4_define([_b4_percent_define_check_values],
|
m4_define([_b4_percent_define_check_values],
|
||||||
[b4_percent_define_ifdef_([$1],
|
[b4_percent_define_ifdef_([$1],
|
||||||
[m4_pushdef([b4_good_value], [0])dnl
|
[b4_percent_define_check_kind(]$1[, [keyword], [deprecated])dnl
|
||||||
|
m4_pushdef([b4_good_value], [0])dnl
|
||||||
m4_if($#, 1, [],
|
m4_if($#, 1, [],
|
||||||
[m4_foreach([b4_value], m4_dquote(m4_shift($@)),
|
[m4_foreach([b4_value], m4_dquote(m4_shift($@)),
|
||||||
[m4_if(m4_indir([b4_percent_define(]$1[)]), b4_value,
|
[m4_if(m4_indir([b4_percent_define(]$1[)]), b4_value,
|
||||||
|
|||||||
@@ -5877,7 +5877,7 @@ Boolean.
|
|||||||
@item Default Value:
|
@item Default Value:
|
||||||
@code{false}
|
@code{false}
|
||||||
@item History:
|
@item History:
|
||||||
introduced in Bison 2.8
|
introduced in Bison 3.0
|
||||||
@end itemize
|
@end itemize
|
||||||
@end deffn
|
@end deffn
|
||||||
@c api.token.constructor
|
@c api.token.constructor
|
||||||
@@ -6016,7 +6016,7 @@ Use this name as semantic value.
|
|||||||
@end itemize
|
@end itemize
|
||||||
|
|
||||||
@item History:
|
@item History:
|
||||||
introduced in Bison 2.8. Was introduced for Java only in 2.3b as
|
introduced in Bison 3.0. Was introduced for Java only in 2.3b as
|
||||||
@code{stype}.
|
@code{stype}.
|
||||||
@end itemize
|
@end itemize
|
||||||
@end deffn
|
@end deffn
|
||||||
@@ -6048,8 +6048,8 @@ feedback will help to stabilize it.)
|
|||||||
@item @code{most} otherwise.
|
@item @code{most} otherwise.
|
||||||
@end itemize
|
@end itemize
|
||||||
@item History:
|
@item History:
|
||||||
introduced as @code{lr.default-reduction} in 2.5, renamed as
|
introduced as @code{lr.default-reductions} in 2.5, renamed as
|
||||||
@code{lr.default-reduction} in 2.8.
|
@code{lr.default-reduction} in 3.0.
|
||||||
@end itemize
|
@end itemize
|
||||||
@end deffn
|
@end deffn
|
||||||
|
|
||||||
@@ -6066,7 +6066,7 @@ remain in the parser tables. @xref{Unreachable States}.
|
|||||||
@item History:
|
@item History:
|
||||||
introduced as @code{lr.keep_unreachable_states} in 2.3b, renamed as
|
introduced as @code{lr.keep_unreachable_states} in 2.3b, renamed as
|
||||||
@code{lr.keep-unreachable-states} in 2.5, and as
|
@code{lr.keep-unreachable-states} in 2.5, and as
|
||||||
@code{lr.keep-unreachable-state} in 2.8.
|
@code{lr.keep-unreachable-state} in 3.0.
|
||||||
@end itemize
|
@end itemize
|
||||||
@end deffn
|
@end deffn
|
||||||
@c lr.keep-unreachable-state
|
@c lr.keep-unreachable-state
|
||||||
|
|||||||
@@ -579,6 +579,42 @@ muscle_percent_define_get (char const *variable)
|
|||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* The kind of VARIABLE. An error if undefined. */
|
||||||
|
static muscle_kind
|
||||||
|
muscle_percent_define_get_kind (char const *variable)
|
||||||
|
{
|
||||||
|
return muscle_kind_new (muscle_percent_define_get_raw (variable, "kind"));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check the kind of VARIABLE. An error if undefined. */
|
||||||
|
static void
|
||||||
|
muscle_percent_define_check_kind (char const *variable, muscle_kind kind)
|
||||||
|
{
|
||||||
|
if (muscle_percent_define_get_kind (variable) != kind)
|
||||||
|
{
|
||||||
|
location loc = muscle_percent_define_get_loc (variable);
|
||||||
|
switch (kind)
|
||||||
|
{
|
||||||
|
case muscle_code:
|
||||||
|
complain (&loc, Wdeprecated,
|
||||||
|
"%%define variable '%s' requires '{...}' values",
|
||||||
|
variable);
|
||||||
|
break;
|
||||||
|
case muscle_keyword:
|
||||||
|
complain (&loc, Wdeprecated,
|
||||||
|
"%%define variable '%s' requires keyword values",
|
||||||
|
variable);
|
||||||
|
break;
|
||||||
|
case muscle_string:
|
||||||
|
complain (&loc, Wdeprecated,
|
||||||
|
"%%define variable '%s' requires '\"...\"' values",
|
||||||
|
variable);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
location
|
location
|
||||||
muscle_percent_define_get_loc (char const *variable)
|
muscle_percent_define_get_loc (char const *variable)
|
||||||
{
|
{
|
||||||
@@ -612,6 +648,7 @@ muscle_percent_define_flag_if (char const *variable)
|
|||||||
if (muscle_percent_define_ifdef (variable))
|
if (muscle_percent_define_ifdef (variable))
|
||||||
{
|
{
|
||||||
char *value = muscle_percent_define_get (variable);
|
char *value = muscle_percent_define_get (variable);
|
||||||
|
muscle_percent_define_check_kind (variable, muscle_keyword);
|
||||||
if (value[0] == '\0' || STREQ (value, "true"))
|
if (value[0] == '\0' || STREQ (value, "true"))
|
||||||
result = true;
|
result = true;
|
||||||
else if (STREQ (value, "false"))
|
else if (STREQ (value, "false"))
|
||||||
@@ -640,6 +677,7 @@ muscle_percent_define_default (char const *variable, char const *value)
|
|||||||
if (!muscle_find_const (name))
|
if (!muscle_find_const (name))
|
||||||
{
|
{
|
||||||
MUSCLE_INSERT_STRING (name, value);
|
MUSCLE_INSERT_STRING (name, value);
|
||||||
|
MUSCLE_INSERT_STRING (muscle_name (variable, "kind"), "keyword");
|
||||||
{
|
{
|
||||||
uniqstr loc_name = muscle_name (variable, "loc");
|
uniqstr loc_name = muscle_name (variable, "loc");
|
||||||
location loc;
|
location loc;
|
||||||
@@ -661,6 +699,7 @@ muscle_percent_define_check_values (char const * const *values)
|
|||||||
char const * const *variablep = values;
|
char const * const *variablep = values;
|
||||||
uniqstr name = muscle_name (*variablep, NULL);
|
uniqstr name = muscle_name (*variablep, NULL);
|
||||||
char *value = string_decode (name);
|
char *value = string_decode (name);
|
||||||
|
muscle_percent_define_check_kind (*variablep, muscle_keyword);
|
||||||
if (value)
|
if (value)
|
||||||
{
|
{
|
||||||
for (++values; *values; ++values)
|
for (++values; *values; ++values)
|
||||||
|
|||||||
@@ -1463,6 +1463,39 @@ m4_popdef([AT_TEST])
|
|||||||
AT_CLEANUP
|
AT_CLEANUP
|
||||||
|
|
||||||
|
|
||||||
|
## --------------------------- ##
|
||||||
|
## %define keyword variables. ##
|
||||||
|
## --------------------------- ##
|
||||||
|
|
||||||
|
AT_SETUP([["%define" keyword variables]])
|
||||||
|
|
||||||
|
m4_pushdef([AT_TEST],
|
||||||
|
[AT_DATA([input.y],
|
||||||
|
[[%define api.pure ]$1[true]$2[
|
||||||
|
%define api.push-pull ]$1[both]$2[
|
||||||
|
%define lr.default-reduction ]$1[most]$2[
|
||||||
|
%define lr.keep-unreachable-state ]$1[true]$2[
|
||||||
|
%define lr.type ]$1[lalr]$2[
|
||||||
|
%%
|
||||||
|
exp: %empty
|
||||||
|
]])
|
||||||
|
|
||||||
|
AT_BISON_CHECK([[input.y]], [0], [],
|
||||||
|
[[input.y:5.9-15: warning: %define variable 'lr.type' requires keyword values [-Wdeprecated]
|
||||||
|
input.y:3.9-28: warning: %define variable 'lr.default-reduction' requires keyword values [-Wdeprecated]
|
||||||
|
input.y:4.9-33: warning: %define variable 'lr.keep-unreachable-state' requires keyword values [-Wdeprecated]
|
||||||
|
input.y:2.9-21: warning: %define variable 'api.push-pull' requires keyword values [-Wdeprecated]
|
||||||
|
input.y:1.9-16: warning: %define variable 'api.pure' requires keyword values [-Wdeprecated]
|
||||||
|
]])
|
||||||
|
])
|
||||||
|
|
||||||
|
AT_TEST(["], ["])
|
||||||
|
AT_TEST([{], [}])
|
||||||
|
m4_popdef([AT_TEST])
|
||||||
|
|
||||||
|
AT_CLEANUP
|
||||||
|
|
||||||
|
|
||||||
## ------------------------ ##
|
## ------------------------ ##
|
||||||
## %define enum variables. ##
|
## %define enum variables. ##
|
||||||
## ------------------------ ##
|
## ------------------------ ##
|
||||||
|
|||||||
Reference in New Issue
Block a user