mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-09 12:23:04 +00:00
Miscellaneous %define and %code cleanup.
* data/bison.m4 (b4_percent_define_flag_if): Correct comments on how values are interpreted. * doc/bison.texinfo (Decl Summary): Clean up and extend %define documentation a little more. * src/muscle_tab.c (MUSCLE_USER_NAME_CONVERT, muscle_percent_define_insert, muscle_percent_code_grow): New functions/macros. * src/muscle_tab.h (muscle_percent_define_insert, muscle_percent_code_grow): Prototype. * src/parse-gram.y (prologue_declaration): Use muscle_percent_define_insert and muscle_percent_code_grow when parsing %define and %code directives. Make it easy to share %define boolean variables between the front-end and back-end. Though not used yet, this will be useful in the future. * data/bison.m4 (b4_check_user_names): Rewrite comments to talk about Bison uses of names rather than just skeleton uses of names. (b4_percent_define_get, b4_percent_define_ifdef): Rename b4_percent_define_skeleton_variables(VARIABLE) to b4_percent_define_bison_variables(VARIABLE). (b4_percent_code_get, b4_percent_code_ifdef): Rename b4_percent_code_skeleton_qualifiers(QUALIFIER) to b4_percent_code_bison_qualifiers(QUALIFIER). (b4_check_user_names_wrap): Update for renames. * src/muscle_tab.c, src/muscle_tab.h (muscle_percent_define_flag_if, muscle_percent_define_default): New functions mimicking b4_percent_define_flag_if and b4_percent_define_default. For %define variables, report locations for invalid values and redefinitions. * data/bison.m4 (b4_percent_define_flag_if): Read b4_percent_define_loc(VARIABLE) to report the location of an invalid value for VARIABLE. (b4_percent_define_default): Save a special location in b4_percent_define_loc(VARIABLE) in case the default value for VARIABLE must later be reported as invalid. * src/muscle_tab.c (muscle_location_grow, muscle_location_decode): New functions. (muscle_percent_define_insert): Record the location of VARIABLE in muscle percent_define_loc(VARIABLE), and use it to report the previous location for a redefinition. (muscle_percent_define_flag_if): Update like b4_percent_define_flag_if. (muscle_percent_define_default): Update like b4_percent_define_default. (muscle_grow_user_name_list): Rename to... (muscle_user_name_list_grow): ... this for consistency and use muscle_location_grow. * src/muscle_tab.h (muscle_location_grow): Prototype. * tests/input.at (%define errors): Update expected output. * tests/skeletons.at (%define boolean variables: invalid skeleton defaults): New test case.
This commit is contained in:
105
data/bison.m4
105
data/bison.m4
@@ -285,11 +285,11 @@ b4_define_user_code([pre_prologue])
|
||||
b4_define_user_code([stype])
|
||||
|
||||
|
||||
# b4_check_user_names(WHAT, USER-LIST, SKELETON-NAMESPACE)
|
||||
# b4_check_user_names(WHAT, USER-LIST, BISON-NAMESPACE)
|
||||
# --------------------------------------------------------
|
||||
# Warn if any name of type WHAT is used by the user (as recorded in USER-LIST)
|
||||
# but is not used by the skeleton (as recorded by macros in the namespace
|
||||
# SKELETON-NAMESPACE).
|
||||
# but is not used by Bison (as recorded by macros in the namespace
|
||||
# BISON-NAMESPACE).
|
||||
#
|
||||
# USER-LIST must expand to a list specifying all grammar occurrences of all
|
||||
# names of type WHAT. Each item in the list must be a triplet specifying one
|
||||
@@ -304,22 +304,22 @@ b4_define_user_code([stype])
|
||||
# [[[[bar]], [[parser.y:5.7]], [[parser.y:5.16]]]],
|
||||
# [[[[baz]], [[parser.y:8.7]], [[parser.y:8.16]]]]]])
|
||||
#
|
||||
# The macro SKELETON-NAMESPACE(bar) must be defined iff the name bar of type
|
||||
# WHAT is used in the skeleton. Empty string names are fine, but it would be
|
||||
# ugly for a Bison skeleton to actually use one.
|
||||
# The macro BISON-NAMESPACE(bar) must be defined iff the name bar of type WHAT
|
||||
# is used by Bison (in the front-end or in the skeleton). Empty string names
|
||||
# are fine, but it would be ugly for Bison to actually use one.
|
||||
#
|
||||
# For example, to use b4_foo_skeleton_names for SKELETON-NAMESPACE and define
|
||||
# that the names bar and baz are used in the skeleton:
|
||||
# For example, to use b4_foo_bison_names for BISON-NAMESPACE and define that
|
||||
# the names bar and baz are used by Bison:
|
||||
#
|
||||
# m4_define([b4_foo_skeleton_names(bar)])
|
||||
# m4_define([b4_foo_skeleton_names(baz)])
|
||||
# m4_define([b4_foo_bison_names(bar)])
|
||||
# m4_define([b4_foo_bison_names(baz)])
|
||||
#
|
||||
# To invoke b4_check_user_names with TYPE foo, with USER-LIST
|
||||
# b4_foo_user_names, with SKELETON-NAMESPACE b4_foo_skeleton_names, and with
|
||||
# correct quoting:
|
||||
# b4_foo_user_names, with BISON-NAMESPACE b4_foo_bison_names, and with correct
|
||||
# quoting:
|
||||
#
|
||||
# b4_check_user_names([[foo]], [b4_foo_user_names],
|
||||
# [[b4_foo_skeleton_names]])
|
||||
# [[b4_foo_bison_names]])
|
||||
m4_define([b4_check_user_names],
|
||||
[m4_foreach([b4_occurrence], $2,
|
||||
[m4_pushdef([b4_occurrence], b4_occurrence)dnl
|
||||
@@ -339,60 +339,79 @@ m4_popdef([b4_end])dnl
|
||||
# b4_percent_define_get(VARIABLE)
|
||||
# -------------------------------
|
||||
# If the %define variable VARIABLE is defined, emit its value. Also, record
|
||||
# the skeleton's usage of VARIABLE by defining
|
||||
# b4_percent_define_skeleton_variables(VARIABLE).
|
||||
# Bison's usage of VARIABLE by defining
|
||||
# b4_percent_define_bison_variables(VARIABLE).
|
||||
#
|
||||
# For example:
|
||||
#
|
||||
# b4_percent_define_get([[foo]])
|
||||
m4_define([b4_percent_define_get],
|
||||
[m4_define([b4_percent_define_skeleton_variables(]$1[)])dnl
|
||||
[m4_define([b4_percent_define_bison_variables(]$1[)])dnl
|
||||
m4_ifdef([b4_percent_define(]$1[)], [m4_indir([b4_percent_define(]$1[)])])])
|
||||
|
||||
# b4_percent_define_ifdef(VARIABLE, IF-TRUE, [IF-FALSE])
|
||||
# ------------------------------------------------------
|
||||
# If the %define variable VARIABLE is defined, expand IF-TRUE, else expand
|
||||
# IF-FALSE. Also, record the skeleton's usage of VARIABLE by defining
|
||||
# b4_percent_define_skeleton_variables(VARIABLE).
|
||||
# IF-FALSE. Also, record Bison's usage of VARIABLE by defining
|
||||
# b4_percent_define_bison_variables(VARIABLE).
|
||||
#
|
||||
# For example:
|
||||
#
|
||||
# b4_percent_define_ifdef([[foo]], [[it's defined]], [[it's undefined]])
|
||||
m4_define([b4_percent_define_ifdef],
|
||||
[m4_ifdef([b4_percent_define(]$1[)],
|
||||
[m4_define([b4_percent_define_skeleton_variables(]$1[)])$2],
|
||||
[m4_define([b4_percent_define_bison_variables(]$1[)])$2],
|
||||
[$3])])
|
||||
|
||||
# b4_percent_define_flag_if(VARIABLE, IF-TRUE, [IF-FALSE])
|
||||
# --------------------------------------------------------
|
||||
# If the %define variable VARIABLE is defined to anything but "0" or "false",
|
||||
# expand IF-TRUE. If it is defined to "0" or "false", expand IF-FALSE. If
|
||||
# it is undefined, raise an error (this macro should be preceded by
|
||||
# b4_percent_define_default). Also, record the skeleton's usage of VARIABLE by
|
||||
# defining b4_percent_define_skeleton_variables(VARIABLE).
|
||||
# Mimic muscle_percent_define_flag_if in ../src/muscle_tab.h exactly. That is,
|
||||
# if the %define variable VARIABLE is defined to "" or "true", expand IF-TRUE.
|
||||
# If it is defined to "false", expand IF-FALSE. Complain if it is undefined
|
||||
# (a Bison or skeleton error since the default value should have been set
|
||||
# already) or defined to any other value (possibly a user error). Also, record
|
||||
# Bison's usage of VARIABLE by defining
|
||||
# b4_percent_define_bison_variables(VARIABLE).
|
||||
#
|
||||
# For example:
|
||||
#
|
||||
# b4_percent_define_flag_if([[foo]], [[it's true]], [[it's false]])
|
||||
m4_define([b4_percent_define_flag_if],
|
||||
[b4_percent_define_ifdef([$1],
|
||||
[m4_case(b4_percent_define_get([$1]),
|
||||
[], [$2], [true], [$2], [false], [$3],
|
||||
[m4_expand_once(
|
||||
[b4_complain([[invalid value for %%define variable `%s']], [$1])],
|
||||
[[b4_percent_define_flag_if($1)]])])],
|
||||
[b4_fatal([[invalid %%define variable `%s' passed to b4_percent_define_flag_if]], [$1])])])
|
||||
[m4_case(b4_percent_define_get([$1]),
|
||||
[], [$2], [true], [$2], [false], [$3],
|
||||
[m4_expand_once([dnl
|
||||
m4_pushdef([b4_loc], m4_indir([b4_percent_define_loc(]$1[)]))dnl
|
||||
b4_complain_at(b4_loc,
|
||||
[[invalid value for %%define boolean variable `%s']],
|
||||
[$1])dnl
|
||||
m4_popdef([b4_loc])],
|
||||
[[b4_percent_define_flag_if($1)]])])],
|
||||
[b4_fatal([[undefined %%define variable `%s' passed to b4_percent_define_flag_if]], [$1])])])
|
||||
|
||||
# b4_percent_define_default(VARIABLE, DEFAULT)
|
||||
# --------------------------------------------
|
||||
# If the %define variable VARIABLE is undefined, set its value to DEFAULT.
|
||||
# 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.
|
||||
# Don't record this as a Bison usage of VARIABLE as there's no reason to
|
||||
# suspect that the value has yet influenced the output.
|
||||
#
|
||||
# For example:
|
||||
#
|
||||
# b4_percent_define_default([[foo]], [[default value]])
|
||||
m4_define([b4_percent_define_default],
|
||||
[m4_ifndef([b4_percent_define(]$1[)],
|
||||
[m4_define([b4_percent_define(]$1[)], [$2])])])
|
||||
[m4_define([b4_percent_define(]$1[)], [$2])dnl
|
||||
m4_define([b4_percent_define_loc(]$1[)],
|
||||
[[[[[Bison:b4_percent_define_default]:0.0]], [[[Bison:b4_percent_define_default]:0.0]]]])])])
|
||||
|
||||
# b4_percent_code_get([QUALIFIER])
|
||||
# --------------------------------
|
||||
# If any %code blocks for QUALIFIER are defined, emit them beginning with a
|
||||
# comment and ending with synclines and a newline. If QUALIFIER is not
|
||||
# specified or empty, do this for the unqualified %code blocks. Also, record
|
||||
# the skeleton's usage of QUALIFIER (if specified) by defining
|
||||
# b4_percent_code_skeleton_qualifiers(QUALIFIER).
|
||||
# Bison's usage of QUALIFIER (if specified) by defining
|
||||
# b4_percent_code_bison_qualifiers(QUALIFIER).
|
||||
#
|
||||
# For example, to emit any unqualified %code blocks followed by any %code
|
||||
# blocks for the qualifier foo:
|
||||
@@ -401,7 +420,7 @@ m4_define([b4_percent_define_default],
|
||||
# b4_percent_code_get([[foo]])
|
||||
m4_define([b4_percent_code_get],
|
||||
[m4_pushdef([b4_macro_name], [[b4_percent_code(]$1[)]])dnl
|
||||
m4_ifval([$1], [m4_define([b4_percent_code_skeleton_qualifiers(]$1[)])])dnl
|
||||
m4_ifval([$1], [m4_define([b4_percent_code_bison_qualifiers(]$1[)])])dnl
|
||||
m4_ifdef(b4_macro_name,
|
||||
[b4_comment([m4_if([$#], [0], [[Unqualified %code]],
|
||||
[[%code "]$1["]])[ blocks.]])
|
||||
@@ -413,24 +432,24 @@ m4_popdef([b4_macro_name])])
|
||||
# -----------------------------------------------------
|
||||
# If any %code blocks for QUALIFIER (or unqualified %code blocks if
|
||||
# QUALIFIER is empty) are defined, expand IF-TRUE, else expand IF-FALSE.
|
||||
# Also, record the skeleton's usage of QUALIFIER (if specified) by defining
|
||||
# b4_percent_code_skeleton_qualifiers(QUALIFIER).
|
||||
# Also, record Bison's usage of QUALIFIER (if specified) by defining
|
||||
# b4_percent_code_bison_qualifiers(QUALIFIER).
|
||||
m4_define([b4_percent_code_ifdef],
|
||||
[m4_ifdef([b4_percent_code(]$1[)],
|
||||
[m4_ifval([$1], [m4_define([b4_percent_code_skeleton_qualifiers(]$1[)])])$2],
|
||||
[m4_ifval([$1], [m4_define([b4_percent_code_bison_qualifiers(]$1[)])])$2],
|
||||
[$3])])
|
||||
|
||||
|
||||
## --------------------------------------------------------- ##
|
||||
## After processing the skeletons, check that all the user's ##
|
||||
## %define variables and %code qualifiers were used. ##
|
||||
## --------------------------------------------------------- ##
|
||||
## ----------------------------------------------------------- ##
|
||||
## After processing the skeletons, check that all the user's ##
|
||||
## %define variables and %code qualifiers were used by Bison. ##
|
||||
## ----------------------------------------------------------- ##
|
||||
|
||||
m4_define([b4_check_user_names_wrap],
|
||||
[m4_ifdef([b4_percent_]$1[_user_]$2[s],
|
||||
[b4_check_user_names([[%]$1 $2],
|
||||
[b4_percent_]$1[_user_]$2[s],
|
||||
[[b4_percent_]$1[_skeleton_]$2[s]])])])
|
||||
[[b4_percent_]$1[_bison_]$2[s]])])])
|
||||
|
||||
m4_wrap([
|
||||
b4_check_user_names_wrap([[define]], [[variable]])
|
||||
|
||||
Reference in New Issue
Block a user