X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/35b8730d018b0bb25f7864d0db20f687ebad11b6..cf499cff31eabd04e37107484647bdd453137d1d:/data/bison.m4 diff --git a/data/bison.m4 b/data/bison.m4 index fbf375bd..09287214 100644 --- a/data/bison.m4 +++ b/data/bison.m4 @@ -1,7 +1,8 @@ -*- Autoconf -*- # Language-independent M4 Macros for Bison. -# Copyright (C) 2002, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. +# Copyright (C) 2002, 2004, 2005, 2006, 2007, 2008, 2009 +# Free Software Foundation, Inc. # 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 @@ -21,14 +22,17 @@ ## Identification. ## ## ---------------- ## -# b4_copyright(TITLE, YEARS) -# -------------------------- +# b4_copyright(TITLE, [YEARS]) +# ---------------------------- +# If YEARS are not defined, use b4_copyright_years. m4_define([b4_copyright], [b4_comment([A Bison parser, made by GNU Bison b4_version.]) b4_comment([$1 -m4_text_wrap([Copyright (C) $2 Free Software Foundation, Inc.], [ ]) +]m4_dquote(m4_text_wrap([Copyright (C) +]m4_ifval([$2], [[$2]], [m4_defn([b4_copyright_years])])[ +Free Software Foundation, Inc.]))[ 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 @@ -74,7 +78,8 @@ version 2.2 of Bison.])]) m4_define([b4_cat], [m4_syscmd([cat <<'_m4eof' ]m4_bpatsubst(m4_dquote($1), [_m4eof], [_m4@`eof])[@ -_m4eof])dnl +_m4eof +])dnl m4_if(m4_sysval, [0], [], [m4_fatal([$0: cannot write to stdout])])]) # b4_error(KIND, FORMAT, [ARG1], [ARG2], ...) @@ -207,6 +212,87 @@ m4_define([b4_ints_in], [m4_eval([$3 <= $1 && $1 <= $4 && $3 <= $2 && $2 <= $4])]) +# b4_subtract(LHS, RHS) +# --------------------- +# Evaluate LHS - RHS if they are integer literals, otherwise expand +# to (LHS) - (RHS). +m4_define([b4_subtract], +[m4_bmatch([$1$2], [^[0123456789]*$], + [m4_eval([$1 - $2])], + [($1) - ($2)])]) + +# b4_args(ARG1, ...) +# _b4_args(ARG1, ...) +# ------------------- +# Join with comma, skipping empty arguments. +# b4_args calls itself recursively until it sees the first non-empty +# argument, then calls _b4_args which prepends each non-empty argument +# with a comma. +m4_define([b4_args], +[m4_if([$#$1], + [1], [], + [m4_ifval([$1], + [$1[]_$0(m4_shift($@))], + [$0(m4_shift($@))])])]) + +# _b4_args(ARGS1, ...) +# -------------------- +m4_define([_b4_args], +[m4_if([$#$1], + [1], [], + [m4_ifval([$1], [, $1])[]$0(m4_shift($@))])]) + + + + +# b4_integral_parser_tables_map(MACRO) +# ------------------------------------- +# Map MACRO on all the integral tables. MACRO is expected to have +# the signature MACRO(TABLE-NAME, CONTENT, COMMENT). +m4_define([b4_integral_parser_tables_map], +[$1([pact], [b4_pact], + [[YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing +STATE-NUM.]]) + +$1([defact], [b4_defact], + [[YYDEFACT[S] -- default reduction number in state S. Performed when +YYTABLE does not specify something else to do. Zero means the default +is an error.]]) + +$1([pgoto], [b4_pgoto], [[YYPGOTO[NTERM-NUM].]]) + +$1([defgoto], [b4_defgoto], [[YYDEFGOTO[NTERM-NUM].]]) + +$1([table], [b4_table], + [[YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If +positive, shift that token. If negative, reduce the rule which +number is the opposite. If YYTABLE_NINF, syntax error.]]) + +$1([check], [b4_check]) + +$1([stos], [b4_stos], + [[STOS_[STATE-NUM] -- The (internal number of the) accessing +symbol of state STATE-NUM.]]) + +$1([r1], [b4_r1], + [[YYR1[YYN] -- Symbol number of symbol that rule YYN derives.]]) + +$1([r2], [b4_r2], + [[YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.]]) +]) + + +# b4_parser_tables_declare +# b4_parser_tables_define +# ------------------------ +# Define/declare the (deterministic) parser tables. +m4_define([b4_parser_tables_declare], +[b4_integral_parser_tables_map([b4_integral_parser_table_declare])]) + +m4_define([b4_parser_tables_define], +[b4_integral_parser_tables_map([b4_integral_parser_table_define])]) + + ## ------------------ ## ## Decoding options. ## @@ -245,17 +331,120 @@ m4_define([b4_$3_if], # ----------------------------- # Expand IF-TRUE, if FLAG is true, IF-FALSE otherwise. b4_define_flag_if([defines]) # Whether headers are requested. -b4_define_flag_if([error_verbose]) # Whether error are verbose. b4_define_flag_if([glr]) # Whether a GLR parser is requested. -b4_define_flag_if([locations]) # Whether locations are tracked. b4_define_flag_if([nondeterministic]) # Whether conflicts should be handled. -b4_define_flag_if([pure]) # Whether the interface is pure. b4_define_flag_if([yacc]) # Whether POSIX Yacc is emulated. -## ------------------------- ## -## Assigning token numbers. ## -## ------------------------- ## +## --------- ## +## Symbols. ## +## --------- ## + +# b4_symbol_(NUM, FIELD) +# ---------------------- +# Recover a FIELD about symbol #NUM. Thanks to m4_indir, fails if +# undefined. +m4_define([b4_symbol_], +[m4_indir([b4_symbol($1, $2)])]) + + +# b4_symbol(NUM, FIELD) +# --------------------- +# Recover a FIELD about symbol #NUM. Thanks to m4_indir, fails if +# undefined. If FIELD = id, prepend the prefix. +m4_define([b4_symbol], +[m4_case([$2], + [id], [m4_do([b4_percent_define_get([api.tokens.prefix])], + [b4_symbol_([$1], [id])])], + [b4_symbol_($@)])]) + + +# b4_symbol_if(NUM, FIELD, IF-TRUE, IF-FALSE) +# ------------------------------------------- +# If FIELD about symbol #NUM is 1 expand IF-TRUE, if is 0, expand IF-FALSE. +# Otherwise an error. +m4_define([b4_symbol_if], +[m4_case(b4_symbol([$1], [$2]), + [1], [$3], + [0], [$4], + [m4_fatal([$0: field $2 of $1 is not a Boolean:] b4_symbol([$1], [$2]))])]) + + +# b4_symbol_action_location(SYMBOL-NUM, KIND) +# ------------------------------------------- +# Report the location of the KIND action as FILE:LINE. +m4_define([b4_symbol_action_location], +[b4_symbol([$1], [$2_file]):b4_syncline([b4_symbol([$1], [$2_line])])]) + + +# b4_symbol_action(SYMBOL-NUM, KIND) +# ---------------------------------- +# Run the action KIND (destructor or printer) for SYMBOL-NUM. +# Same as in C, but using references instead of pointers. +m4_define([b4_symbol_action], +[b4_symbol_if([$1], [has_$2], +[m4_pushdef([b4_dollar_dollar], + [b4_symbol_value([(*yyvaluep)], + b4_symbol_if([$1], [has_type], + [b4_symbol([$1], [type])]))])dnl +m4_pushdef([b4_at_dollar], [(*yylocationp)])dnl + b4_symbol_case_([$1]) +b4_syncline([b4_symbol([$1], [$2_line])], ["b4_symbol([$1], [$2_file])"]) + b4_symbol([$1], [$2]) +b4_syncline([@oline@], [@ofile@]) + break; + +m4_popdef([b4_at_dollar])dnl +m4_popdef([b4_dollar_dollar])dnl +])]) + + +# b4_symbol_destructor(SYMBOL-NUM) +# b4_symbol_printer(SYMBOL-NUM) +# -------------------------------- +m4_define([b4_symbol_destructor], [b4_symbol_action([$1], [destructor])]) +m4_define([b4_symbol_printer], [b4_symbol_action([$1], [printer])]) + + +# b4_symbol_case_(SYMBOL-NUM) +# --------------------------- +# Issue a "case NUM" for SYMBOL-NUM. +m4_define([b4_symbol_case_], +[ case b4_symbol([$1], [number]): // b4_symbol([$1], [tag]) +]) + + +# b4_symbol_foreach(MACRO) +# ------------------------ +# Invoke MACRO(SYMBOL-NUM) for each SYMBOL-NUM. +m4_define([b4_symbol_foreach], + [m4_map([$1], m4_defn([b4_symbol_numbers]))]) + + +## ------- ## +## Types. ## +## ------- ## + +# b4_type_action_(NUMS) +# --------------------- +# Run actions for the symbol NUMS that all have the same type-name. +# Skip NUMS that have no type-name. +m4_define([b4_type_action_], +[b4_symbol_if([$1], [has_type], +[m4_map([b4_symbol_case_], [$@])[]dnl + b4_dollar_dollar([b4_symbol([$1], [number])], + [b4_symbol([$1], [tag])], + [b4_symbol([$1], [type])]); + break; + +])]) + +# b4_type_foreach(MACRO) +# ---------------------- +# Invoke MACRO(SYMBOL-NUMS) for each set of SYMBOL-NUMS for each type set. +m4_define([b4_type_foreach], + [m4_map([$1], m4_defn([b4_type_names]))]) + ## ----------- ## @@ -273,8 +462,8 @@ m4_define([b4_basename], # b4_syncline(LINE, FILE) # ----------------------- m4_define([b4_syncline], -[b4_flag_if([synclines], [ -b4_sync_end([__line__], [b4_basename(m4_quote(__file__))]) +[b4_flag_if([synclines], +[b4_sync_end([__line__], [b4_basename(m4_quote(__file__))]) b4_sync_start([$1], [$2])])]) m4_define([b4_sync_end], [b4_comment([Line $1 of $2])]) @@ -316,8 +505,8 @@ b4_define_user_code([stype]) # 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 +# USER-LIST must expand to a list specifying all user occurrences of all names +# of type WHAT. Each item in the list must be a triplet specifying one # occurrence: name, start boundary, and end boundary. Empty string names are # fine. An empty list is fine. # @@ -361,6 +550,20 @@ m4_popdef([b4_start])dnl m4_popdef([b4_end])dnl ])]) + + +## --------------------- ## +## b4_percent_define_*. ## +## --------------------- ## + + +# b4_percent_define_use(VARIABLE) +# ------------------------------- +# Declare that VARIABLE was used. +m4_define([b4_percent_define_use], +[m4_define([b4_percent_define_bison_variables(]$1[)])dnl +]) + # b4_percent_define_get(VARIABLE) # ------------------------------- # Mimic muscle_percent_define_get in ../src/muscle_tab.h exactly. That is, if @@ -372,7 +575,7 @@ m4_popdef([b4_end])dnl # # b4_percent_define_get([[foo]]) m4_define([b4_percent_define_get], -[m4_define([b4_percent_define_bison_variables(]$1[)])dnl +[b4_percent_define_use([$1])dnl m4_ifdef([b4_percent_define(]$1[)], [m4_indir([b4_percent_define(]$1[)])])]) # b4_percent_define_get_loc(VARIABLE) @@ -423,9 +626,15 @@ m4_define([b4_percent_define_get_syncline], # 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_bison_variables(]$1[)])$2], + [b4_percent_define_use([$1])$2], [$3])]) + +## --------- ## +## Options. ## +## --------- ## + + # b4_percent_define_flag_if(VARIABLE, IF-TRUE, [IF-FALSE]) # -------------------------------------------------------- # Mimic muscle_percent_define_flag_if in ../src/muscle_tab.h exactly. That is, @@ -449,6 +658,7 @@ m4_define([b4_percent_define_flag_if], [[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) # -------------------------------------------- # Mimic muscle_percent_define_default in ../src/muscle_tab.h exactly. That is, @@ -463,10 +673,23 @@ m4_define([b4_percent_define_default], [m4_ifndef([b4_percent_define(]$1[)], [m4_define([b4_percent_define(]$1[)], [$2])dnl m4_define([b4_percent_define_loc(]$1[)], - [[[[[Bison:b4_percent_define_default]:1.0]], [[[Bison:b4_percent_define_default]:1.0]]]])dnl - m4_define([b4_percent_define_syncline(]$1[)], - [[]b4_syncline(1, [["[Bison:b4_percent_define_default]"]])[ -]])])]) + [[[[:-1.-1]], + [[:-1.-1]]]])dnl + m4_define([b4_percent_define_syncline(]$1[)], [[]])])]) + + +# b4_percent_define_if_define(VARIABLE) +# ------------------------------------- +# Define b4_VARIABLE_if that executes its $1 or $2 depending whether +# VARIABLE was %defined. The characters `.' and `-' in VARIABLE are mapped +# to `_'. +m4_define([b4_percent_define_if_define_], +[m4_define(m4_bpatsubst([b4_$1_if], [[-.]], [_]), + [b4_percent_define_flag_if([$1], [$2], [$3])])]) +m4_define([b4_percent_define_if_define], +[b4_percent_define_default([[$1]], [[false]]) +b4_percent_define_if_define_([$1], $[1], $[2])]) + # b4_percent_define_check_values(VALUES) # -------------------------------------- @@ -499,7 +722,11 @@ m4_define([_b4_percent_define_check_values], [b4_complain_at(b4_percent_define_get_loc([$1]), [[invalid value for %%define variable `%s': `%s']], [$1], - m4_dquote(m4_indir([b4_percent_define(]$1[)])))])dnl + m4_dquote(m4_indir([b4_percent_define(]$1[)]))) + m4_foreach([b4_value], m4_dquote(m4_shift($@)), + [b4_complain_at(b4_percent_define_get_loc([$1]), + [[accepted value: `%s']], + m4_dquote(b4_value))])])dnl m4_popdef([b4_good_value])], [b4_fatal([[undefined %%define variable `%s' passed to b4_percent_define_check_values]], [$1])])]) @@ -521,7 +748,7 @@ m4_define([b4_percent_code_get], 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.]]) + [["%code ]$1["]])[ blocks.]]) b4_user_code([m4_indir(b4_macro_name)]) ])dnl m4_popdef([b4_macro_name])]) @@ -538,6 +765,41 @@ m4_define([b4_percent_code_ifdef], [$3])]) +## ------------------ ## +## Common variables. ## +## ------------------ ## + +# Default values for %define. +# --------------------------- +# If the api.tokens.prefix, it is empty. +m4_percent_define_default([[api.tokens.prefix]], [[]]) + +# b4_parse_assert_if([IF-ASSERTIONS-ARE-USED], [IF-NOT]) +# b4_parse_trace_if([IF-DEBUG-TRACES-ARE-ENABLED], [IF-NOT]) +# b4_lex_symbol_if([IF-YYLEX-RETURNS-A-COMPLETE-SYMBOL], [IF-NOT]) +# b4_variant_if([IF-VARIANT-ARE-USED], [IF-NOT]) +# ---------------------------------------------- +b4_percent_define_if_define([lex_symbol]) +b4_percent_define_if_define([locations]) # Whether locations are tracked. +b4_percent_define_if_define([parse.assert]) +b4_percent_define_if_define([parse.trace]) +b4_percent_define_if_define([variant]) + + +# b4_error_verbose_if([IF-ERRORS-ARE-VERBOSE], [IF-NOT]) +# ------------------------------------------------------ +# Map %define parse.error "(simple|verbose)" to b4_error_verbose_if and +# b4_error_verbose_flag. +b4_percent_define_default([[parse.error]], [[simple]]) +b4_percent_define_check_values([[[[parse.error]], + [[simple]], [[verbose]]]]) +m4_define([b4_error_verbose_flag], + m4_case(b4_percent_define_get([[parse.error]]), + [simple], [[0]], + [verbose], [[1]])) +b4_define_flag_if([error_verbose]) + + ## ----------------------------------------------------------- ## ## After processing the skeletons, check that all the user's ## ## %define variables and %code qualifiers were used by Bison. ## @@ -549,7 +811,7 @@ m4_define([b4_check_user_names_wrap], [b4_percent_]$1[_user_]$2[s], [[b4_percent_]$1[_bison_]$2[s]])])]) -m4_wrap([ +m4_wrap_lifo([ b4_check_user_names_wrap([[define]], [[variable]]) b4_check_user_names_wrap([[code]], [[qualifier]]) ])