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