]> git.saurik.com Git - bison.git/blame - data/bison.m4
Get rid of yyrhs and yyprhs in yacc.c.
[bison.git] / data / bison.m4
CommitLineData
08af01c2 1 -*- Autoconf -*-
90b9908d
PB
2
3# Language-independent M4 Macros for Bison.
42ee26bb
JD
4# Copyright (C) 2002, 2004, 2005, 2006, 2007, 2008 Free Software Foundation,
5# Inc.
90b9908d 6
f16b0819 7# This program is free software: you can redistribute it and/or modify
90b9908d 8# it under the terms of the GNU General Public License as published by
f16b0819 9# the Free Software Foundation, either version 3 of the License, or
90b9908d 10# (at your option) any later version.
f16b0819 11#
90b9908d
PB
12# This program is distributed in the hope that it will be useful,
13# but WITHOUT ANY WARRANTY; without even the implied warranty of
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15# GNU General Public License for more details.
f16b0819 16#
90b9908d 17# You should have received a copy of the GNU General Public License
f16b0819 18# along with this program. If not, see <http://www.gnu.org/licenses/>.
90b9908d
PB
19
20
21## ---------------- ##
22## Identification. ##
23## ---------------- ##
24
a9ce3f54
AD
25# b4_copyright(TITLE, [YEARS])
26# ----------------------------
27# If YEARS are not defined, use b4_copyright_years.
90b9908d
PB
28m4_define([b4_copyright],
29[b4_comment([A Bison parser, made by GNU Bison b4_version.])
30
31b4_comment([$1
32
a9ce3f54
AD
33]m4_dquote(m4_text_wrap([Copyright (C)
34]m4_ifval([$2], [[$2]], [m4_defn([b4_copyright_years])])[
35Free Software Foundation, Inc.]))[
90b9908d 36
f16b0819 37This program is free software: you can redistribute it and/or modify
90b9908d 38it under the terms of the GNU General Public License as published by
f16b0819
PE
39the Free Software Foundation, either version 3 of the License, or
40(at your option) any later version.
90b9908d
PB
41
42This program is distributed in the hope that it will be useful,
43but WITHOUT ANY WARRANTY; without even the implied warranty of
44MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
45GNU General Public License for more details.
46
47You should have received a copy of the GNU General Public License
f16b0819 48along with this program. If not, see <http://www.gnu.org/licenses/>.])
90b9908d
PB
49
50b4_comment([As a special exception, you may create a larger work that contains
51part or all of the Bison parser skeleton and distribute that work
52under terms of your choice, so long as that work isn't itself a
53parser generator using the skeleton or a modified version thereof
54as a parser skeleton. Alternatively, if you modify or redistribute
55the parser skeleton itself, you may (at your option) remove this
56special exception, which will cause the skeleton and the resulting
57Bison output files to be licensed under the GNU General Public
58License without this special exception.
59
60This special exception was added by the Free Software Foundation in
61version 2.2 of Bison.])])
62
63
08af01c2
JD
64## ---------------- ##
65## Error handling. ##
66## ---------------- ##
67
7dc4a694
JD
68# The following error handling macros print error directives that should not
69# become arguments of other macro invocations since they would likely then be
70# mangled. Thus, they print to stdout directly.
71
72# b4_cat(TEXT)
73# ------------
74# Write TEXT to stdout. Precede the final newline with an @ so that it's
75# escaped. For example:
76#
77# b4_cat([[@complain(invalid input@)]])
78m4_define([b4_cat],
79[m4_syscmd([cat <<'_m4eof'
80]m4_bpatsubst(m4_dquote($1), [_m4eof], [_m4@`eof])[@
66f0441d
JD
81_m4eof
82])dnl
7dc4a694
JD
83m4_if(m4_sysval, [0], [], [m4_fatal([$0: cannot write to stdout])])])
84
08af01c2 85# b4_error(KIND, FORMAT, [ARG1], [ARG2], ...)
7eb8a0bc 86# -------------------------------------------
7dc4a694
JD
87# Write @KIND(FORMAT@,ARG1@,ARG2@,...@) to stdout.
88#
89# For example:
90#
91# b4_error([[warn]], [[invalid value for `%s': %s]], [[foo]], [[3]])
08af01c2 92m4_define([b4_error],
7dc4a694
JD
93[b4_cat([[@]$1[(]$2[]]dnl
94[m4_if([$#], [2], [],
95 [m4_foreach([b4_arg],
96 m4_dquote(m4_shift(m4_shift($@))),
97 [[@,]b4_arg])])[@)]])])
08af01c2 98
3fc65ead 99# b4_error_at(KIND, START, END, FORMAT, [ARG1], [ARG2], ...)
7eb8a0bc 100# ----------------------------------------------------------
7dc4a694
JD
101# Write @KIND_at(START@,END@,FORMAT@,ARG1@,ARG2@,...@) to stdout.
102#
103# For example:
104#
105# b4_error_at([[complain]], [[input.y:2.3]], [[input.y:5.4]],
106# [[invalid %s]], [[foo]])
3fc65ead 107m4_define([b4_error_at],
7dc4a694
JD
108[b4_cat([[@]$1[_at(]$2[@,]$3[@,]$4[]]dnl
109[m4_if([$#], [4], [],
110 [m4_foreach([b4_arg],
111 m4_dquote(m4_shift(m4_shift(m4_shift(m4_shift($@))))),
112 [[@,]b4_arg])])[@)]])])
3fc65ead 113
08af01c2 114# b4_warn(FORMAT, [ARG1], [ARG2], ...)
7eb8a0bc 115# ------------------------------------
7dc4a694
JD
116# Write @warn(FORMAT@,ARG1@,ARG2@,...@) to stdout.
117#
118# For example:
119#
120# b4_warn([[invalid value for `%s': %s]], [[foo]], [[3]])
08af01c2
JD
121#
122# As a simple test suite, this:
123#
7dc4a694 124# m4_divert(-1)
08af01c2
JD
125# m4_define([asdf], [ASDF])
126# m4_define([fsa], [FSA])
127# m4_define([fdsa], [FDSA])
128# b4_warn([[[asdf), asdf]]], [[[fsa), fsa]]], [[[fdsa), fdsa]]])
08af01c2 129# b4_warn([[asdf), asdf]], [[fsa), fsa]], [[fdsa), fdsa]])
08af01c2 130# b4_warn()
08af01c2 131# b4_warn(1)
08af01c2
JD
132# b4_warn(1, 2)
133#
7dc4a694 134# Should produce this without newlines:
08af01c2
JD
135#
136# @warn([asdf), asdf]@,[fsa), fsa]@,[fdsa), fdsa]@)
137# @warn(asdf), asdf@,fsa), fsa@,fdsa), fdsa@)
08af01c2 138# @warn(@)
08af01c2
JD
139# @warn(1@)
140# @warn(1@,2@)
141m4_define([b4_warn],
142[b4_error([[warn]], $@)])
143
3fc65ead 144# b4_warn_at(START, END, FORMAT, [ARG1], [ARG2], ...)
7eb8a0bc 145# ---------------------------------------------------
7dc4a694
JD
146# Write @warn(START@,END@,FORMAT@,ARG1@,ARG2@,...@) to stdout.
147#
148# For example:
149#
150# b4_warn_at([[input.y:2.3]], [[input.y:5.4]], [[invalid %s]], [[foo]])
3fc65ead
JD
151m4_define([b4_warn_at],
152[b4_error_at([[warn]], $@)])
153
08af01c2 154# b4_complain(FORMAT, [ARG1], [ARG2], ...)
7eb8a0bc 155# ----------------------------------------
7dc4a694 156# Write @complain(FORMAT@,ARG1@,ARG2@,...@) to stdout.
08af01c2 157#
7dc4a694 158# See b4_warn example.
08af01c2
JD
159m4_define([b4_complain],
160[b4_error([[complain]], $@)])
161
3fc65ead 162# b4_complain_at(START, END, FORMAT, [ARG1], [ARG2], ...)
7eb8a0bc 163# -------------------------------------------------------
7dc4a694
JD
164# Write @complain(START@,END@,FORMAT@,ARG1@,ARG2@,...@) to stdout.
165#
166# See b4_warn_at example.
3fc65ead
JD
167m4_define([b4_complain_at],
168[b4_error_at([[complain]], $@)])
169
08af01c2 170# b4_fatal(FORMAT, [ARG1], [ARG2], ...)
7eb8a0bc 171# -------------------------------------
7dc4a694 172# Write @fatal(FORMAT@,ARG1@,ARG2@,...@) to stdout and exit.
08af01c2 173#
7dc4a694 174# See b4_warn example.
08af01c2 175m4_define([b4_fatal],
7dc4a694
JD
176[b4_error([[fatal]], $@)dnl
177m4_exit(1)])
08af01c2 178
3fc65ead 179# b4_fatal_at(START, END, FORMAT, [ARG1], [ARG2], ...)
7eb8a0bc 180# ----------------------------------------------------
7dc4a694
JD
181# Write @fatal(START@,END@,FORMAT@,ARG1@,ARG2@,...@) to stdout and exit.
182#
183# See b4_warn_at example.
3fc65ead 184m4_define([b4_fatal_at],
7dc4a694
JD
185[b4_error_at([[fatal]], $@)dnl
186m4_exit(1)])
3fc65ead 187
08af01c2 188
90b9908d
PB
189## ---------------- ##
190## Default values. ##
191## ---------------- ##
192
193# m4_define_default([b4_lex_param], []) dnl breaks other skeletons
7ecec4dd
JD
194m4_define_default([b4_pre_prologue], [])
195m4_define_default([b4_post_prologue], [])
90b9908d
PB
196m4_define_default([b4_epilogue], [])
197m4_define_default([b4_parse_param], [])
198
199# The initial column and line.
200m4_define_default([b4_location_initial_column], [1])
201m4_define_default([b4_location_initial_line], [1])
202
203
204## ------------ ##
205## Data Types. ##
206## ------------ ##
207
208# b4_ints_in(INT1, INT2, LOW, HIGH)
209# ---------------------------------
210# Return 1 iff both INT1 and INT2 are in [LOW, HIGH], 0 otherwise.
211m4_define([b4_ints_in],
212[m4_eval([$3 <= $1 && $1 <= $4 && $3 <= $2 && $2 <= $4])])
213
214
bd187d7b
AD
215# b4_subtract(LHS, RHS)
216# ---------------------
217# Evaluate LHS - RHS if they are integer literals, otherwise expand
218# to (LHS) - (RHS).
219m4_define([b4_subtract],
220[m4_bmatch([$1$2], [^[0123456789]*$],
221 [m4_eval([$1 - $2])],
222 [($1) - ($2)])])
223
e0c653e7
AD
224# b4_args(ARG1, ...)
225# _b4_args(ARG1, ...)
226# -------------------
227# Join with comma, skipping empty arguments.
228# b4_args calls itself recursively until it sees the first non-empty
229# argument, then calls _b4_args which prepends each non-empty argument
230# with a comma.
231m4_define([b4_args],
232[m4_if([$#$1],
233 [1], [],
234 [m4_ifval([$1],
235 [$1[]_$0(m4_shift($@))],
236 [$0(m4_shift($@))])])])
237
238# _b4_args(ARGS1, ...)
239# --------------------
240m4_define([_b4_args],
241[m4_if([$#$1],
242 [1], [],
243 [m4_ifval([$1], [, $1])[]$0(m4_shift($@))])])
244
245
246
90b9908d
PB
247
248## ------------------ ##
249## Decoding options. ##
250## ------------------ ##
251
252# b4_flag_if(FLAG, IF-TRUE, IF-FALSE)
253# -----------------------------------
254# Run IF-TRUE if b4_FLAG_flag is 1, IF-FALSE if FLAG is 0, otherwise fail.
255m4_define([b4_flag_if],
256[m4_case(b4_$1_flag,
257 [0], [$3],
258 [1], [$2],
259 [m4_fatal([invalid $1 value: ]$1)])])
260
261
262# b4_define_flag_if(FLAG)
263# -----------------------
264# Define "b4_FLAG_if(IF-TRUE, IF-FALSE)" that depends on the
265# value of the Boolean FLAG.
266m4_define([b4_define_flag_if],
267[_b4_define_flag_if($[1], $[2], [$1])])
268
269# _b4_define_flag_if($1, $2, FLAG)
270# --------------------------------
271# This macro works around the impossibility to define macros
272# inside macros, because issuing `[$1]' is not possible in M4 :(.
273# This sucks hard, GNU M4 should really provide M5 like $$1.
274m4_define([_b4_define_flag_if],
275[m4_if([$1$2], $[1]$[2], [],
276 [m4_fatal([$0: Invalid arguments: $@])])dnl
277m4_define([b4_$3_if],
278 [b4_flag_if([$3], [$1], [$2])])])
279
280
281# b4_FLAG_if(IF-TRUE, IF-FALSE)
282# -----------------------------
283# Expand IF-TRUE, if FLAG is true, IF-FALSE otherwise.
284b4_define_flag_if([defines]) # Whether headers are requested.
285b4_define_flag_if([error_verbose]) # Whether error are verbose.
286b4_define_flag_if([glr]) # Whether a GLR parser is requested.
287b4_define_flag_if([locations]) # Whether locations are tracked.
288b4_define_flag_if([nondeterministic]) # Whether conflicts should be handled.
90b9908d
PB
289b4_define_flag_if([yacc]) # Whether POSIX Yacc is emulated.
290
291
90b9908d
PB
292## ----------- ##
293## Synclines. ##
294## ----------- ##
295
296# b4_basename(NAME)
297# -----------------
298# Similar to POSIX basename; the differences don't matter here.
299# Beware that NAME is not evaluated.
300m4_define([b4_basename],
301[m4_bpatsubst([$1], [^.*/\([^/]+\)/*$], [\1])])
302
303
304# b4_syncline(LINE, FILE)
305# -----------------------
306m4_define([b4_syncline],
307[b4_flag_if([synclines], [
308b4_sync_end([__line__], [b4_basename(m4_quote(__file__))])
309b4_sync_start([$1], [$2])])])
310
311m4_define([b4_sync_end], [b4_comment([Line $1 of $2])])
312m4_define([b4_sync_start], [b4_comment([Line $1 of $2])])
313
314# b4_user_code(USER-CODE)
315# -----------------------
316# Emit code from the user, ending it with synclines.
317m4_define([b4_user_code],
318[$1
319b4_syncline([@oline@], [@ofile@])])
320
321
322# b4_define_user_code(MACRO)
323# --------------------------
324# From b4_MACRO, build b4_user_MACRO that includes the synclines.
325m4_define([b4_define_user_code],
326[m4_define([b4_user_$1],
327[b4_user_code([b4_$1])])])
328
329
330# b4_user_actions
331# b4_user_initial_action
332# b4_user_post_prologue
136a0f76 333# b4_user_pre_prologue
90b9908d
PB
334# b4_user_stype
335# ----------------------
336# Macros that issue user code, ending with synclines.
337b4_define_user_code([actions])
338b4_define_user_code([initial_action])
339b4_define_user_code([post_prologue])
136a0f76 340b4_define_user_code([pre_prologue])
90b9908d
PB
341b4_define_user_code([stype])
342
1c7b7e1d 343
9611cfa2 344# b4_check_user_names(WHAT, USER-LIST, BISON-NAMESPACE)
a4e25e1d 345# --------------------------------------------------------
6afc30cc 346# Warn if any name of type WHAT is used by the user (as recorded in USER-LIST)
9611cfa2
JD
347# but is not used by Bison (as recorded by macros in the namespace
348# BISON-NAMESPACE).
7eb8a0bc 349#
6afc30cc 350# USER-LIST must expand to a list specifying all grammar occurrences of all
a4e25e1d 351# names of type WHAT. Each item in the list must be a triplet specifying one
6afc30cc
JD
352# occurrence: name, start boundary, and end boundary. Empty string names are
353# fine. An empty list is fine.
7eb8a0bc 354#
a4e25e1d 355# For example, to define b4_foo_user_names to be used for USER-LIST with three
6afc30cc 356# name occurrences and with correct quoting:
8e0a5e9e 357#
a4e25e1d 358# m4_define([b4_foo_user_names],
7eb8a0bc
JD
359# [[[[[[bar]], [[parser.y:1.7]], [[parser.y:1.16]]]],
360# [[[[bar]], [[parser.y:5.7]], [[parser.y:5.16]]]],
361# [[[[baz]], [[parser.y:8.7]], [[parser.y:8.16]]]]]])
1c7b7e1d 362#
9611cfa2
JD
363# The macro BISON-NAMESPACE(bar) must be defined iff the name bar of type WHAT
364# is used by Bison (in the front-end or in the skeleton). Empty string names
365# are fine, but it would be ugly for Bison to actually use one.
6afc30cc 366#
9611cfa2
JD
367# For example, to use b4_foo_bison_names for BISON-NAMESPACE and define that
368# the names bar and baz are used by Bison:
1c7b7e1d 369#
9611cfa2
JD
370# m4_define([b4_foo_bison_names(bar)])
371# m4_define([b4_foo_bison_names(baz)])
1c7b7e1d 372#
6afc30cc 373# To invoke b4_check_user_names with TYPE foo, with USER-LIST
9611cfa2
JD
374# b4_foo_user_names, with BISON-NAMESPACE b4_foo_bison_names, and with correct
375# quoting:
1c7b7e1d 376#
a4e25e1d 377# b4_check_user_names([[foo]], [b4_foo_user_names],
9611cfa2 378# [[b4_foo_bison_names]])
6afc30cc
JD
379m4_define([b4_check_user_names],
380[m4_foreach([b4_occurrence], $2,
381[m4_pushdef([b4_occurrence], b4_occurrence)dnl
382m4_pushdef([b4_user_name], m4_car(b4_occurrence))dnl
383m4_pushdef([b4_start], m4_car(m4_shift(b4_occurrence)))dnl
384m4_pushdef([b4_end], m4_shift(m4_shift(b4_occurrence)))dnl
a4e25e1d
JD
385m4_ifndef($3[(]m4_quote(b4_user_name)[)],
386 [b4_warn_at([b4_start], [b4_end],
5f340b48 387 [[%s `%s' is not used]],
a4e25e1d 388 [$1], [b4_user_name])])[]dnl
6afc30cc
JD
389m4_popdef([b4_occurrence])dnl
390m4_popdef([b4_user_name])dnl
391m4_popdef([b4_start])dnl
392m4_popdef([b4_end])dnl
393])])
394
a4e25e1d
JD
395# b4_percent_define_get(VARIABLE)
396# -------------------------------
f124d423
JD
397# Mimic muscle_percent_define_get in ../src/muscle_tab.h exactly. That is, if
398# the %define variable VARIABLE is defined, emit its value. Also, record
9611cfa2
JD
399# Bison's usage of VARIABLE by defining
400# b4_percent_define_bison_variables(VARIABLE).
a4e25e1d
JD
401#
402# For example:
403#
404# b4_percent_define_get([[foo]])
405m4_define([b4_percent_define_get],
9611cfa2 406[m4_define([b4_percent_define_bison_variables(]$1[)])dnl
a4e25e1d
JD
407m4_ifdef([b4_percent_define(]$1[)], [m4_indir([b4_percent_define(]$1[)])])])
408
35b8730d
JD
409# b4_percent_define_get_loc(VARIABLE)
410# -----------------------------------
411# Mimic muscle_percent_define_get_loc in ../src/muscle_tab.h exactly. That is,
412# if the %define variable VARIABLE is undefined, complain fatally since that's
413# a Bison or skeleton error. Otherwise, return its definition location in a
414# form approriate for the first two arguments of b4_warn_at, b4_complain_at, or
415# b4_fatal_at. Don't record this as a Bison usage of VARIABLE as there's no
416# reason to suspect that the user-supplied value has yet influenced the output.
417#
418# For example:
419#
420# b4_complain_at(b4_percent_define_get_loc([[foo]]), [[invalid foo]])
421m4_define([b4_percent_define_get_loc],
422[m4_ifdef([b4_percent_define_loc(]$1[)],
423 [m4_pushdef([b4_loc], m4_indir([b4_percent_define_loc(]$1[)]))dnl
424b4_loc[]dnl
425m4_popdef([b4_loc])],
426 [b4_fatal([[undefined %%define variable `%s' passed to b4_percent_define_get_loc]], [$1])])])
427
428# b4_percent_define_get_syncline(VARIABLE)
429# ----------------------------------------
430# Mimic muscle_percent_define_get_syncline in ../src/muscle_tab.h exactly.
431# That is, if the %define variable VARIABLE is undefined, complain fatally
432# since that's a Bison or skeleton error. Otherwise, return its definition
433# location as a b4_syncline invocation. Don't record this as a Bison usage of
434# VARIABLE as there's no reason to suspect that the user-supplied value has yet
435# influenced the output.
436#
437# For example:
438#
439# b4_percent_define_get_syncline([[foo]])
440m4_define([b4_percent_define_get_syncline],
441[m4_ifdef([b4_percent_define_syncline(]$1[)],
442 [m4_indir([b4_percent_define_syncline(]$1[)])],
443 [b4_fatal([[undefined %%define variable `%s' passed to b4_percent_define_get_syncline]], [$1])])])
444
592d0b1e
PB
445# b4_percent_define_ifdef(VARIABLE, IF-TRUE, [IF-FALSE])
446# ------------------------------------------------------
f124d423
JD
447# Mimic muscle_percent_define_ifdef in ../src/muscle_tab.h exactly. That is,
448# if the %define variable VARIABLE is defined, expand IF-TRUE, else expand
9611cfa2
JD
449# IF-FALSE. Also, record Bison's usage of VARIABLE by defining
450# b4_percent_define_bison_variables(VARIABLE).
451#
452# For example:
453#
454# b4_percent_define_ifdef([[foo]], [[it's defined]], [[it's undefined]])
592d0b1e
PB
455m4_define([b4_percent_define_ifdef],
456[m4_ifdef([b4_percent_define(]$1[)],
9611cfa2 457 [m4_define([b4_percent_define_bison_variables(]$1[)])$2],
592d0b1e
PB
458 [$3])])
459
460# b4_percent_define_flag_if(VARIABLE, IF-TRUE, [IF-FALSE])
461# --------------------------------------------------------
9611cfa2
JD
462# Mimic muscle_percent_define_flag_if in ../src/muscle_tab.h exactly. That is,
463# if the %define variable VARIABLE is defined to "" or "true", expand IF-TRUE.
464# If it is defined to "false", expand IF-FALSE. Complain if it is undefined
465# (a Bison or skeleton error since the default value should have been set
466# already) or defined to any other value (possibly a user error). Also, record
467# Bison's usage of VARIABLE by defining
468# b4_percent_define_bison_variables(VARIABLE).
469#
470# For example:
471#
472# b4_percent_define_flag_if([[foo]], [[it's true]], [[it's false]])
592d0b1e
PB
473m4_define([b4_percent_define_flag_if],
474[b4_percent_define_ifdef([$1],
9611cfa2
JD
475 [m4_case(b4_percent_define_get([$1]),
476 [], [$2], [true], [$2], [false], [$3],
35b8730d
JD
477 [m4_expand_once([b4_complain_at(b4_percent_define_get_loc([$1]),
478 [[invalid value for %%define Boolean variable `%s']],
479 [$1])],
480 [[b4_percent_define_flag_if($1)]])])],
9611cfa2 481 [b4_fatal([[undefined %%define variable `%s' passed to b4_percent_define_flag_if]], [$1])])])
592d0b1e 482
a4e25e1d
JD
483# b4_percent_define_default(VARIABLE, DEFAULT)
484# --------------------------------------------
9611cfa2
JD
485# Mimic muscle_percent_define_default in ../src/muscle_tab.h exactly. That is,
486# if the %define variable VARIABLE is undefined, set its value to DEFAULT.
487# Don't record this as a Bison usage of VARIABLE as there's no reason to
488# suspect that the value has yet influenced the output.
a4e25e1d
JD
489#
490# For example:
491#
492# b4_percent_define_default([[foo]], [[default value]])
493m4_define([b4_percent_define_default],
494[m4_ifndef([b4_percent_define(]$1[)],
9611cfa2
JD
495 [m4_define([b4_percent_define(]$1[)], [$2])dnl
496 m4_define([b4_percent_define_loc(]$1[)],
35b8730d
JD
497 [[[[[Bison:b4_percent_define_default]:1.0]], [[[Bison:b4_percent_define_default]:1.0]]]])dnl
498 m4_define([b4_percent_define_syncline(]$1[)],
499 [[]b4_syncline(1, [["[Bison:b4_percent_define_default]"]])[
500]])])])
6afc30cc 501
d782395d
JD
502# b4_percent_define_check_values(VALUES)
503# --------------------------------------
504# Mimic muscle_percent_define_check_values in ../src/muscle_tab.h exactly
505# except that the VALUES structure is more appropriate for M4. That is, VALUES
506# is a list of sublists of strings. For each sublist, the first string is the
507# name of a %define variable, and all remaining strings in that sublist are the
508# valid values for that variable. Complain if such a variable is undefined (a
509# Bison error since the default value should have been set already) or defined
510# to any other value (possibly a user error). Don't record this as a Bison
511# usage of the variable as there's no reason to suspect that the value has yet
512# influenced the output.
513#
514# For example:
515#
516# b4_percent_define_check_values([[[[foo]], [[foo-value1]], [[foo-value2]]]],
517# [[[[bar]], [[bar-value1]]]])
518m4_define([b4_percent_define_check_values],
519[m4_foreach([b4_sublist], m4_quote($@),
520 [_b4_percent_define_check_values(b4_sublist)])])
521
522m4_define([_b4_percent_define_check_values],
523[m4_ifdef([b4_percent_define(]$1[)],
524 [m4_pushdef([b4_good_value], [0])dnl
525 m4_if($#, 1, [],
526 [m4_foreach([b4_value], m4_dquote(m4_shift($@)),
527 [m4_if(m4_indir([b4_percent_define(]$1[)]), b4_value,
528 [m4_define([b4_good_value], [1])])])])dnl
529 m4_if(b4_good_value, [0],
35b8730d 530 [b4_complain_at(b4_percent_define_get_loc([$1]),
d782395d
JD
531 [[invalid value for %%define variable `%s': `%s']],
532 [$1],
35b8730d 533 m4_dquote(m4_indir([b4_percent_define(]$1[)])))])dnl
d782395d
JD
534 m4_popdef([b4_good_value])],
535 [b4_fatal([[undefined %%define variable `%s' passed to b4_percent_define_check_values]], [$1])])])
536
a4e25e1d 537# b4_percent_code_get([QUALIFIER])
6afc30cc
JD
538# --------------------------------
539# If any %code blocks for QUALIFIER are defined, emit them beginning with a
540# comment and ending with synclines and a newline. If QUALIFIER is not
592d0b1e 541# specified or empty, do this for the unqualified %code blocks. Also, record
9611cfa2
JD
542# Bison's usage of QUALIFIER (if specified) by defining
543# b4_percent_code_bison_qualifiers(QUALIFIER).
a4e25e1d
JD
544#
545# For example, to emit any unqualified %code blocks followed by any %code
546# blocks for the qualifier foo:
547#
548# b4_percent_code_get
549# b4_percent_code_get([[foo]])
550m4_define([b4_percent_code_get],
592d0b1e 551[m4_pushdef([b4_macro_name], [[b4_percent_code(]$1[)]])dnl
9611cfa2 552m4_ifval([$1], [m4_define([b4_percent_code_bison_qualifiers(]$1[)])])dnl
6afc30cc
JD
553m4_ifdef(b4_macro_name,
554[b4_comment([m4_if([$#], [0], [[Unqualified %code]],
42ee26bb 555 [["%code ]$1["]])[ blocks.]])
a4e25e1d
JD
556b4_user_code([m4_indir(b4_macro_name)])
557])dnl
6afc30cc
JD
558m4_popdef([b4_macro_name])])
559
592d0b1e
PB
560# b4_percent_code_ifdef(QUALIFIER, IF-TRUE, [IF-FALSE])
561# -----------------------------------------------------
562# If any %code blocks for QUALIFIER (or unqualified %code blocks if
563# QUALIFIER is empty) are defined, expand IF-TRUE, else expand IF-FALSE.
9611cfa2
JD
564# Also, record Bison's usage of QUALIFIER (if specified) by defining
565# b4_percent_code_bison_qualifiers(QUALIFIER).
592d0b1e
PB
566m4_define([b4_percent_code_ifdef],
567[m4_ifdef([b4_percent_code(]$1[)],
9611cfa2 568 [m4_ifval([$1], [m4_define([b4_percent_code_bison_qualifiers(]$1[)])])$2],
592d0b1e
PB
569 [$3])])
570
6afc30cc 571
5679f311
AD
572# Default values for %define.
573# ---------------------------
574# If the %token.prefix, it is empty.
575m4_percent_define_default([[token.prefix]], [[]])
576
577
578
9611cfa2
JD
579## ----------------------------------------------------------- ##
580## After processing the skeletons, check that all the user's ##
581## %define variables and %code qualifiers were used by Bison. ##
582## ----------------------------------------------------------- ##
6afc30cc 583
a4e25e1d
JD
584m4_define([b4_check_user_names_wrap],
585[m4_ifdef([b4_percent_]$1[_user_]$2[s],
586 [b4_check_user_names([[%]$1 $2],
587 [b4_percent_]$1[_user_]$2[s],
9611cfa2 588 [[b4_percent_]$1[_bison_]$2[s]])])])
6afc30cc 589
882a1fbf 590m4_wrap_lifo([
a4e25e1d
JD
591b4_check_user_names_wrap([[define]], [[variable]])
592b4_check_user_names_wrap([[code]], [[qualifier]])
6afc30cc 593])