]> git.saurik.com Git - bison.git/commitdiff
Merge remote-tracking branch 'origin/maint'
authorAkim Demaille <akim@lrde.epita.fr>
Mon, 3 Dec 2012 15:27:23 +0000 (16:27 +0100)
committerAkim Demaille <akim@lrde.epita.fr>
Mon, 3 Dec 2012 15:27:23 +0000 (16:27 +0100)
* origin/maint:
  parser: accept #line NUM
  m4: use a safer pattern to enable/disable output
  tests: beware of gnulib's need for config.h
  gnulib: update
  yacc.c, glr.c: check and fix the display of locations
  formatting changes
  glr.c: remove stray macro

Conflicts:
data/c.m4
data/glr.cc
data/lalr1.cc
data/lalr1.java
data/location.cc
data/stack.hh
data/yacc.c
src/scan-gram.l

16 files changed:
1  2 
THANKS
data/bison.m4
data/c.m4
data/glr.c
data/glr.cc
data/lalr1.cc
data/lalr1.java
data/location.cc
data/stack.hh
data/yacc.c
lib/.gitignore
m4/.gitignore
src/location.c
src/scan-gram.l
tests/actions.at
tests/skeletons.at

diff --combined THANKS
index 0c6a81726e7547c8bf9e60c020241368a0a2c4fd,218eea798fdf2c045d2795fef9c7c524fdd6a12a..909a6e004bd1b0a9e38a3dee6e5ca22885c676f3
--- 1/THANKS
--- 2/THANKS
+++ b/THANKS
@@@ -58,6 -58,7 +58,7 @@@ Jim Kent                  jkent@arch.se
  Jim Meyering              jim@meyering.net
  Joel E. Denny             joeldenny@joeldenny.org
  Johan van Selst           johans@stack.nl
+ Jonathan Fabrizio         jonathan.fabrizio@lrde.epita.fr
  Jonathan Nieder           jrnieder@gmail.com
  Juan Manuel Guerrero      juan.guerrero@gmx.de
  Kees Zeelenberg           kzlg@users.sourceforge.net
@@@ -74,7 -75,6 +75,7 @@@ Matt Kraai                kraai@alumni.
  Matt Rosing               rosing@peakfive.com
  Michael Hayes             m.hayes@elec.canterbury.ac.nz
  Michael Raskin            7c6f434c@mail.ru
 +Michiel De Wilde          mdewilde.agilent@gmail.com
  Mickael Labau             labau_m@epita.fr
  Mike Castle               dalgoda@ix.netcom.com
  Neil Booth                NeilB@earthling.net
@@@ -95,7 -95,6 +96,7 @@@ Peter Fales               psfales@lucen
  Peter Hamorsky            hamo@upjs.sk
  Peter Simons              simons@cryp.to
  Piotr Gackiewicz          gacek@intertel.com.pl
 +Quentin Hocquet           hocquet@gostai.com
  Quoc Peyrot               chojin@lrde.epita.fr
  R Blake                   blakers@mac.com
  Raja R Harinath           harinath@cs.umn.edu
diff --combined data/bison.m4
index c652b2ec409fa7040145ea35465339d9f137f5ba,a24b162c8177796415cfd297f0a8ec5a951e96e0..bd8af095a55252d19de108ddc8398a2def08447e
  ## 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
@@@ -61,6 -58,30 +61,30 @@@ This special exception was added by th
  version 2.2 of Bison.])])
  
  
+ ## -------- ##
+ ## Output.  ##
+ ## -------- ##
+ # b4_output_begin(FILE)
+ # ---------------------
+ # Enable output, i.e., send to diversion 0, expand after "#", and
+ # generate the tag to output into FILE.  Must be followed by EOL.
+ m4_define([b4_output_begin],
+ [m4_changecom()
+ m4_divert_push(0)dnl
+ @output(m4_unquote([$1])@)@dnl
+ ])
+ # b4_output_end()
+ # ---------------
+ # Output nothing, restore # as comment character (no expansions after #).
+ m4_define([b4_output_end],
+ [m4_divert_pop(0)
+ m4_changecom([#])
+ ])
  ## ---------------- ##
  ## Error handling.  ##
  ## ---------------- ##
@@@ -82,16 -103,30 +106,16 @@@ _m4eo
  ])dnl
  m4_if(m4_sysval, [0], [], [m4_fatal([$0: cannot write to stdout])])])
  
 -# b4_error(KIND, FORMAT, [ARG1], [ARG2], ...)
 -# -------------------------------------------
 -# Write @KIND(FORMAT@,ARG1@,ARG2@,...@) to stdout.
 +# b4_error(KIND, START, END, FORMAT, [ARG1], [ARG2], ...)
 +# -------------------------------------------------------
 +# Write @KIND(START@,END@,FORMAT@,ARG1@,ARG2@,...@) to stdout.
  #
  # For example:
  #
 -#   b4_error([[warn]], [[invalid value for '%s': %s]], [[foo]], [[3]])
 +#   b4_error([[complain]], [[input.y:2.3]], [[input.y:5.4]],
 +#            [[invalid %s]], [[foo]])
  m4_define([b4_error],
 -[b4_cat([[@]$1[(]$2[]]dnl
 -[m4_if([$#], [2], [],
 -       [m4_foreach([b4_arg],
 -                   m4_dquote(m4_shift(m4_shift($@))),
 -                   [[@,]b4_arg])])[@)]])])
 -
 -# b4_error_at(KIND, START, END, FORMAT, [ARG1], [ARG2], ...)
 -# ----------------------------------------------------------
 -# Write @KIND_at(START@,END@,FORMAT@,ARG1@,ARG2@,...@) to stdout.
 -#
 -# For example:
 -#
 -#   b4_error_at([[complain]], [[input.y:2.3]], [[input.y:5.4]],
 -#               [[invalid %s]], [[foo]])
 -m4_define([b4_error_at],
 -[b4_cat([[@]$1[_at(]$2[@,]$3[@,]$4[]]dnl
 +[b4_cat([[@complain][(]$1[@,]$2[@,]$3[@,]$4[]]dnl
  [m4_if([$#], [4], [],
         [m4_foreach([b4_arg],
                     m4_dquote(m4_shift(m4_shift(m4_shift(m4_shift($@))))),
  #   m4_define([asdf], [ASDF])
  #   m4_define([fsa], [FSA])
  #   m4_define([fdsa], [FDSA])
 -#   b4_warn([[[asdf), asdf]]], [[[fsa), fsa]]], [[[fdsa), fdsa]]])
 -#   b4_warn([[asdf), asdf]], [[fsa), fsa]], [[fdsa), fdsa]])
 -#   b4_warn()
 -#   b4_warn(1)
 -#   b4_warn(1, 2)
 +#   b4_warn_at([[[asdf), asdf]]], [[[fsa), fsa]]], [[[fdsa), fdsa]]])
 +#   b4_warn_at([[asdf), asdf]], [[fsa), fsa]], [[fdsa), fdsa]])
 +#   b4_warn_at()
 +#   b4_warn_at(1)
 +#   b4_warn_at(1, 2)
  #
  # Should produce this without newlines:
  #
 -#   @warn([asdf), asdf]@,[fsa), fsa]@,[fdsa), fdsa]@)
 -#   @warn(asdf), asdf@,fsa), fsa@,fdsa), fdsa@)
 +#   @warn_at([asdf), asdf]@,@,@,[fsa), fsa]@,[fdsa), fdsa]@)
 +#   @warn(asdf), asdf@,@,@,fsa), fsa@,fdsa), fdsa@)
  #   @warn(@)
  #   @warn(1@)
  #   @warn(1@,2@)
  m4_define([b4_warn],
 -[b4_error([[warn]], $@)])
 +[b4_error([[warn]], [], [], $@)])
  
  # b4_warn_at(START, END, FORMAT, [ARG1], [ARG2], ...)
  # ---------------------------------------------------
  #
  #   b4_warn_at([[input.y:2.3]], [[input.y:5.4]], [[invalid %s]], [[foo]])
  m4_define([b4_warn_at],
 -[b4_error_at([[warn]], $@)])
 +[b4_error([[warn]], $@)])
  
  # b4_complain(FORMAT, [ARG1], [ARG2], ...)
  # ----------------------------------------
 -# Write @complain(FORMAT@,ARG1@,ARG2@,...@) to stdout.
 +# Bounce to b4_complain_at.
  #
  # See b4_warn example.
  m4_define([b4_complain],
 -[b4_error([[complain]], $@)])
 +[b4_error([[complain]], [], [], $@)])
  
  # b4_complain_at(START, END, FORMAT, [ARG1], [ARG2], ...)
  # -------------------------------------------------------
  #
  # See b4_warn_at example.
  m4_define([b4_complain_at],
 -[b4_error_at([[complain]], $@)])
 +[b4_error([[complain]], $@)])
  
  # b4_fatal(FORMAT, [ARG1], [ARG2], ...)
  # -------------------------------------
 -# Write @fatal(FORMAT@,ARG1@,ARG2@,...@) to stdout and exit.
 +# Bounce to b4_fatal_at.
  #
  # See b4_warn example.
  m4_define([b4_fatal],
 -[b4_error([[fatal]], $@)dnl
 +[b4_error([[fatal]], [], [], $@)dnl
  m4_exit(1)])
  
  # b4_fatal_at(START, END, FORMAT, [ARG1], [ARG2], ...)
  #
  # See b4_warn_at example.
  m4_define([b4_fatal_at],
 -[b4_error_at([[fatal]], $@)dnl
 +[b4_error([[fatal]], $@)dnl
  m4_exit(1)])
  
  
@@@ -183,87 -218,6 +207,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_join(ARG1, ...)
 +# _b4_join(ARG1, ...)
 +# -------------------
 +# Join with comma, skipping empty arguments.
 +# b4_join calls itself recursively until it sees the first non-empty
 +# argument, then calls _b4_join which prepends each non-empty argument
 +# with a comma.
 +m4_define([b4_join],
 +[m4_if([$#$1],
 +       [1], [],
 +       [m4_ifval([$1],
 +                 [$1[]_$0(m4_shift($@))],
 +                 [$0(m4_shift($@))])])])
 +
 +# _b4_join(ARGS1, ...)
 +# --------------------
 +m4_define([_b4_join],
 +[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.  ##
  m4_define([b4_flag_if],
  [m4_case(b4_$1_flag,
           [0], [$3],
 -       [1], [$2],
 -       [m4_fatal([invalid $1 value: ]$1)])])
 +         [1], [$2],
 +         [m4_fatal([invalid $1 value: ]$1)])])
  
  
  # b4_define_flag_if(FLAG)
@@@ -302,164 -256,15 +326,164 @@@ 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([token_table])        # Whether yytoken_table is demanded.
  b4_define_flag_if([yacc])               # Whether POSIX Yacc is emulated.
  
 -# yytoken_table is needed to support verbose errors.
 -b4_error_verbose_if([m4_define([b4_token_table_flag], [1])])
 +
 +## --------- ##
 +## Symbols.  ##
 +## --------- ##
 +
 +# In order to unify the handling of the various aspects of symbols
 +# (tag, type_name, whether terminal, etc.), bison.exe defines one
 +# macro per (token, field), where field can has_id, id, etc.: see
 +# src/output.c:prepare_symbols_definitions().
 +#
 +# The following macros provide access to these values.
 +
 +# 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.token.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],
 +[b4_dollar_pushdef([(*yyvaluep)],
 +                   b4_symbol_if([$1], [has_type],
 +                                [m4_dquote(b4_symbol([$1], [type]))]),
 +                   [(*yylocationp)])dnl
 +      b4_symbol_case_([$1])[]dnl
 +b4_syncline([b4_symbol([$1], [$2_line])], ["b4_symbol([$1], [$2_file])"])
 +        b4_symbol([$1], [$2])
 +b4_syncline([@oline@], [@ofile@])
 +        break;
 +
 +b4_dollar_popdef[]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]))])
 +
 +# b4_symbol_map(MACRO)
 +# --------------------
 +# Return a list (possibly empty elements) of MACRO invoked for each
 +# SYMBOL-NUM.
 +m4_define([b4_symbol_map],
 +[m4_map_args_sep([$1(], [)], [,], b4_symbol_numbers)])
 +
 +
 +# b4_token_visible_if(NUM, IF-TRUE, IF-FALSE)
 +# -------------------------------------------
 +# Whether NUM denotes a token that has an exported definition (i.e.,
 +# shows in enum yytokentype).
 +m4_define([b4_token_visible_if],
 +[b4_symbol_if([$1], [is_token],
 +              [b4_symbol_if([$1], [has_id], [$2], [$3])],
 +              [$3])])
 +
 +# b4_token_has_definition(NUM)
 +# ----------------------------
 +# 1 if NUM is visible, nothing otherwise.
 +m4_define([b4_token_has_definition],
 +[b4_token_visible_if([$1], [1])])
 +
 +# b4_any_token_visible_if([IF-TRUE], [IF-FALSE])
 +# ----------------------------------------------
 +# Whether there is a token that needs to be defined.
 +m4_define([b4_any_token_visible_if],
 +[m4_ifval(b4_symbol_foreach([b4_token_has_definition]),
 +          [$1], [$2])])
 +
 +
 +# b4_token_format(FORMAT, NUM)
 +# ----------------------------
 +m4_define([b4_token_format],
 +[b4_token_visible_if([$2],
 +[m4_quote(m4_format([$1],
 +                     [b4_symbol([$2], [id])],
 +                     [b4_symbol([$2], [user_number])]))])])
 +
 +
 +## ------- ##
 +## 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]))])
  
  
  
@@@ -568,6 -373,7 +592,6 @@@ m4_popdef([b4_end])dn
  
  
  
 -
  ## --------------------- ##
  ## b4_percent_define_*.  ##
  ## --------------------- ##
@@@ -597,6 -403,7 +621,6 @@@ m4_ifdef([b4_percent_define(]$1[)]
           [m4_indir([b4_percent_define(]$1[)])],
           [$2])])
  
 -
  # b4_percent_define_get_loc(VARIABLE)
  # -----------------------------------
  # Mimic muscle_percent_define_get_loc in ../src/muscle-tab.h exactly.  That is,
@@@ -645,14 -452,8 +669,14 @@@ m4_define([b4_percent_define_get_syncli
  #   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],
 -        [$3])])
 +          [b4_percent_define_use([$1])$2],
 +          [$3])])
 +
 +
 +## --------- ##
 +## Options.  ##
 +## --------- ##
 +
  
  # b4_percent_define_flag_if(VARIABLE, IF-TRUE, [IF-FALSE])
  # --------------------------------------------------------
@@@ -677,7 -478,6 +701,7 @@@ m4_define([b4_percent_define_flag_if]
                             [[b4_percent_define_flag_if($1)]])])],
    [b4_fatal([[b4_percent_define_flag_if: undefined %%define variable '%s']], [$1])])])
  
 +
  # b4_percent_define_default(VARIABLE, DEFAULT)
  # --------------------------------------------
  # Mimic muscle_percent_define_default in ../src/muscle-tab.h exactly.  That is,
@@@ -696,21 -496,6 +720,21 @@@ m4_define([b4_percent_define_default]
                          [[<skeleton default value>:-1.-1]]]])dnl
              m4_define([b4_percent_define_syncline(]$1[)], [[]])])])
  
 +
 +# b4_percent_define_if_define(NAME, [VARIABLE = NAME])
 +# ----------------------------------------------------
 +# Define b4_NAME_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(m4_default([$2], [$1]),
 +                                      [$3], [$4])])])
 +m4_define([b4_percent_define_if_define],
 +[b4_percent_define_default([m4_default([$2], [$1])], [[false]])
 +b4_percent_define_if_define_([$1], [$2], $[1], $[2])])
 +
 +
  # b4_percent_define_check_values(VALUES)
  # --------------------------------------
  # Mimic muscle_percent_define_check_values in ../src/muscle-tab.h exactly
@@@ -744,7 -529,7 +768,7 @@@ m4_define([_b4_percent_define_check_val
                           [$1],
                           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]),
 +                     [b4_error([[note]], b4_percent_define_get_loc([$1]), []
                                       [[accepted value: '%s']],
                                       m4_dquote(b4_value))])])dnl
     m4_popdef([b4_good_value])],
@@@ -782,45 -567,7 +806,45 @@@ m4_popdef([b4_macro_name])]
  m4_define([b4_percent_code_ifdef],
  [m4_ifdef([b4_percent_code(]$1[)],
            [m4_ifval([$1], [m4_define([b4_percent_code_bison_qualifiers(]$1[)])])$2],
 -        [$3])])
 +          [$3])])
 +
 +
 +## ------------------ ##
 +## Common variables.  ##
 +## ------------------ ##
 +
 +# Default values for %define.
 +# ---------------------------
 +# If the api.token.prefix, it is empty.
 +m4_percent_define_default([[api.token.prefix]], [[]])
 +
 +# b4_parse_assert_if([IF-ASSERTIONS-ARE-USED], [IF-NOT])
 +# b4_parse_trace_if([IF-DEBUG-TRACES-ARE-ENABLED], [IF-NOT])
 +# b4_token_ctor_if([IF-YYLEX-RETURNS-A-TOKEN], [IF-NOT])
 +# b4_variant_if([IF-VARIANT-ARE-USED], [IF-NOT])
 +# ----------------------------------------------
 +b4_percent_define_if_define([token_ctor], [api.token.constructor])
 +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])
 +
 +# yytoken_table is needed to support verbose errors.
 +b4_error_verbose_if([m4_define([b4_token_table_flag], [1])])
  
  
  ## ----------------------------------------------------------- ##
diff --combined data/c.m4
index 91126a82b84ef325cb83ed406f5d4b0fdf33c2a1,dc3d303616d7e3c746756ccf7252de28e9b67fa6..6c2f552583ef3757f1c44996fd586c45c1039ea6
+++ b/data/c.m4
@@@ -51,28 -51,11 +51,28 @@@ m4_define([b4_cpp_guard_close]
  ## Identification.  ##
  ## ---------------- ##
  
 -# b4_comment(TEXT)
 -# ----------------
 -m4_define([b4_comment], [/* m4_bpatsubst([$1], [
 -], [
 -   ])  */])
 +# b4_comment_(TEXT, OPEN, CONTINUE, END)
 +# --------------------------------------
 +# Put TEXT in comment.  Avoid trailing spaces: don't indent empty lines.
 +# Avoid adding indentation to the first line, as the indentation comes
 +# from OPEN.  That's why we don't patsubst([$1], [^\(.\)], [   \1]).
 +#
 +# Prefix all the output lines with PREFIX.
 +m4_define([b4_comment_], [$2[]m4_bpatsubst([$1], [
 +\(.\)], [
 +$3\1])$4])
 +
 +
 +# b4_comment(TEXT, [PREFIX])
 +# --------------------------
 +# Put TEXT in comment.  Avoid trailing spaces: don't indent empty lines.
 +# Avoid adding indentation to the first line, as the indentation comes
 +# from "/*".  That's why we don't patsubst([$1], [^\(.\)], [   \1]).
 +#
 +# Prefix all the output lines with PREFIX.
 +m4_define([b4_comment],
 +[b4_comment_([$1], [$2/* ], [$2   ], [$2  */])])
 +
  
  # b4_identification
  # -----------------
@@@ -130,7 -113,7 +130,7 @@@ m4_define_default([b4_union_name], [b4_
  # b4_user_args
  # ------------
  m4_define([b4_user_args],
 -[m4_ifset([b4_parse_param], [, b4_c_args(b4_parse_param)])])
 +[m4_ifset([b4_parse_param], [, b4_args(b4_parse_param)])])
  
  
  # b4_parse_param
@@@ -154,13 -137,11 +154,13 @@@ m4_popdef([$2])dn
  m4_popdef([$1])dnl
  ])])
  
 -# b4_parse_param_use
 -# ------------------
 -# `YYUSE' all the parse-params.
 +# b4_parse_param_use([VAL], [LOC])
 +# --------------------------------
 +# `YYUSE' VAL, LOC if locations are enabled, and all the parse-params.
  m4_define([b4_parse_param_use],
 -[b4_parse_param_for([Decl], [Formal], [  YYUSE (Formal);
 +[m4_ifvaln([$1], [  YYUSE([$1]);])dnl
 +b4_locations_if([m4_ifvaln([$2], [  YYUSE ([$2]);])])dnl
 +b4_parse_param_for([Decl], [Formal], [  YYUSE (Formal);
  ])dnl
  ])
  
@@@ -197,11 -178,12 +197,11 @@@ m4_define([b4_int_type_for]
  # --------------------------------------------
  # Without inducing a comparison warning from the compiler, check if the
  # literal value LITERAL equals VALUE from table TABLE, which must have
 -# TABLE_min and TABLE_max defined.  YYID must be defined as an identity
 -# function that suppresses warnings about constant conditions.
 +# TABLE_min and TABLE_max defined.
  m4_define([b4_table_value_equals],
  [m4_if(m4_eval($3 < m4_indir([b4_]$1[_min])
                 || m4_indir([b4_]$1[_max]) < $3), [1],
 -       [[YYID (0)]],
 +       [[0]],
         [(!!(($2) == ($3)))])])
  
  
@@@ -230,150 -212,191 +230,150 @@@ m4_define([b4_null_define]
  # Return a null pointer constant.
  m4_define([b4_null], [YY_NULL])
  
 +# b4_integral_parser_table_define(TABLE-NAME, CONTENT, COMMENT)
 +# -------------------------------------------------------------
 +# Define "yy<TABLE-NAME>" which contents is CONTENT.
 +m4_define([b4_integral_parser_table_define],
 +[m4_ifvaln([$3], [b4_comment([$3], [  ])])dnl
 +static const b4_int_type_for([$2]) yy$1[[]] =
 +{
 +  $2
 +};dnl
 +])
  
  
  ## ------------------------- ##
  ## Assigning token numbers.  ##
  ## ------------------------- ##
  
 -# b4_token_define(TOKEN-NAME, TOKEN-NUMBER)
 -# -----------------------------------------
 +# b4_token_define(TOKEN-NUM)
 +# --------------------------
  # Output the definition of this token as #define.
  m4_define([b4_token_define],
 -[#define $1 $2
 -])
 -
 +[b4_token_format([#define %s %s], [$1])])
  
 -# b4_token_defines(LIST-OF-PAIRS-TOKEN-NAME-TOKEN-NUMBER)
 -# -------------------------------------------------------
 -# Output the definition of the tokens (if there are) as #defines.
 +# b4_token_defines
 +# ----------------
 +# Output the definition of the tokens.
  m4_define([b4_token_defines],
 -[m4_if([$#$1], [1], [],
 -[/* Tokens.  */
 -m4_map([b4_token_define], [$@])])
 -])
 +[b4_any_token_visible_if([/* Tokens.  */
 +m4_join([
 +], b4_symbol_map([b4_token_define]))
 +])])
  
  
 -# b4_token_enum(TOKEN-NAME, TOKEN-NUMBER)
 -# ---------------------------------------
 +# b4_token_enum(TOKEN-NUM)
 +# ------------------------
  # Output the definition of this token as an enum.
  m4_define([b4_token_enum],
 -[$1 = $2])
 +[b4_token_format([%s = %s], [$1])])
  
  
 -# b4_token_enums(LIST-OF-PAIRS-TOKEN-NAME-TOKEN-NUMBER)
 -# -----------------------------------------------------
 +# b4_token_enums
 +# --------------
  # Output the definition of the tokens (if there are) as enums.
  m4_define([b4_token_enums],
 -[m4_if([$#$1], [1], [],
 -[[/* Tokens.  */
 +[b4_any_token_visible_if([[/* Tokens.  */
  #ifndef ]b4_api_PREFIX[TOKENTYPE
  # define ]b4_api_PREFIX[TOKENTYPE
 -   /* Put the tokens into the symbol table, so that GDB and other debuggers
 -      know about them.  */
 -   enum ]b4_api_prefix[tokentype {
 -]m4_map_sep([     b4_token_enum], [,
 -],
 -           [$@])[
 -   };
 +  /* Put the tokens into the symbol table, so that GDB and other debuggers
 +     know about them.  */
 +  enum ]b4_api_prefix[tokentype
 +  {
 +    ]m4_join([,
 +    ],
 +             b4_symbol_map([b4_token_enum]))[
 +  };
  #endif
  ]])])
  
  
 -# b4_token_enums_defines(LIST-OF-PAIRS-TOKEN-NAME-TOKEN-NUMBER)
 -# -------------------------------------------------------------
 -# Output the definition of the tokens (if there are any) as enums and, if POSIX
 -# Yacc is enabled, as #defines.
 +# b4_token_enums_defines
 +# ----------------------
 +# Output the definition of the tokens (if there are any) as enums and,
 +# if POSIX Yacc is enabled, as #defines.
  m4_define([b4_token_enums_defines],
 -[b4_token_enums($@)b4_yacc_if([b4_token_defines($@)], [])
 -])
 +[b4_token_enums[]b4_yacc_if([b4_token_defines])])
  
  
 +## ----------------- ##
 +## Semantic Values.  ##
 +## ----------------- ##
  
 -## --------------------------------------------- ##
 -## Defining C functions in both K&R and ANSI-C.  ##
 -## --------------------------------------------- ##
  
 +# b4_symbol_value(VAL, [TYPE])
 +# ----------------------------
 +# Given a semantic value VAL ($$, $1 etc.), extract its value of type
 +# TYPE if TYPE is given, otherwise just return VAL.  The result can be
 +# used safetly, it is put in parens to avoid nasty precedence issues.
 +# TYPE is *not* put in braces, provide some if needed.
 +m4_define([b4_symbol_value],
 +[($1[]m4_ifval([$2], [.$2]))])
  
 -# b4_modern_c
 -# -----------
 -# A predicate useful in #if to determine whether C is ancient or modern.
 -#
 -# If __STDC__ is defined, the compiler is modern.  IBM xlc 7.0 when run
 -# as 'cc' doesn't define __STDC__ (or __STDC_VERSION__) for pedantic
 -# reasons, but it defines __C99__FUNC__ so check that as well.
 -# Microsoft C normally doesn't define these macros, but it defines _MSC_VER.
 -# Consider a C++ compiler to be modern if it defines __cplusplus.
 -#
 -m4_define([b4_c_modern],
 -  [[(defined __STDC__ || defined __C99__FUNC__ \
 -     || defined __cplusplus || defined _MSC_VER)]])
  
 -# b4_c_function_def(NAME, RETURN-VALUE, [DECL1, NAME1], ...)
 -# ----------------------------------------------------------
 -# Declare the function NAME.
 -m4_define([b4_c_function_def],
 -[#if b4_c_modern
 -b4_c_ansi_function_def($@)
 -#else
 -$2
 -$1 (b4_c_knr_formal_names(m4_shift2($@)))
 -b4_c_knr_formal_decls(m4_shift2($@))
 -#endif[]dnl
 -])
  
 +## ---------------------- ##
 +## Defining C functions.  ##
 +## ---------------------- ##
  
 -# b4_c_ansi_function_def(NAME, RETURN-VALUE, [DECL1, NAME1], ...)
 -# ---------------------------------------------------------------
 -# Declare the function NAME in ANSI.
 -m4_define([b4_c_ansi_function_def],
 +
 +# b4_function_define(NAME, RETURN-VALUE, [DECL1, NAME1], ...)
 +# -----------------------------------------------------------
 +# Declare the function NAME in C.
 +m4_define([b4_function_define],
  [$2
 -$1 (b4_c_ansi_formals(m4_shift2($@)))[]dnl
 +$1 (b4_formals(m4_shift2($@)))[]dnl
  ])
  
  
 -# b4_c_ansi_formals([DECL1, NAME1], ...)
 -# --------------------------------------
 -# Output the arguments ANSI-C definition.
 -m4_define([b4_c_ansi_formals],
 +# b4_formals([DECL1, NAME1], ...)
 +# -------------------------------
 +# The formal arguments of a C function definition.
 +m4_define([b4_formals],
  [m4_if([$#], [0], [void],
         [$#$1], [1], [void],
 -               [m4_map_sep([b4_c_ansi_formal], [, ], [$@])])])
 +               [m4_map_sep([b4_formal], [, ], [$@])])])
  
 -m4_define([b4_c_ansi_formal],
 +m4_define([b4_formal],
  [$1])
  
  
 -# b4_c_knr_formal_names([DECL1, NAME1], ...)
 -# ------------------------------------------
 -# Output the argument names.
 -m4_define([b4_c_knr_formal_names],
 -[m4_map_sep([b4_c_knr_formal_name], [, ], [$@])])
 -
 -m4_define([b4_c_knr_formal_name],
 -[$2])
 -
 -
 -# b4_c_knr_formal_decls([DECL1, NAME1], ...)
 -# ------------------------------------------
 -# Output the K&R argument declarations.
 -m4_define([b4_c_knr_formal_decls],
 -[m4_map_sep([b4_c_knr_formal_decl],
 -            [
 -],
 -            [$@])])
  
 -m4_define([b4_c_knr_formal_decl],
 -[    $1;])
 +## ----------------------- ##
 +## Declaring C functions.  ##
 +## ----------------------- ##
  
  
 -
 -## ------------------------------------------------------------ ##
 -## Declaring (prototyping) C functions in both K&R and ANSI-C.  ##
 -## ------------------------------------------------------------ ##
 -
 -
 -# b4_c_ansi_function_decl(NAME, RETURN-VALUE, [DECL1, NAME1], ...)
 -# ----------------------------------------------------------------
 -# Declare the function NAME ANSI C style.
 -m4_define([b4_c_ansi_function_decl],
 -[$2 $1 (b4_c_ansi_formals(m4_shift2($@)));[]dnl
 +# b4_function_declare(NAME, RETURN-VALUE, [DECL1, NAME1], ...)
 +# ------------------------------------------------------------
 +# Declare the function NAME.
 +m4_define([b4_function_declare],
 +[$2 $1 (b4_formals(m4_shift2($@)));[]dnl
  ])
  
  
  
 -# b4_c_function_decl(NAME, RETURN-VALUE, [DECL1, NAME1], ...)
 -# -----------------------------------------------------------
 -# Declare the function NAME in both K&R and ANSI C.
 -m4_define([b4_c_function_decl],
 -[#if defined __STDC__ || defined __cplusplus
 -b4_c_ansi_function_decl($@)
 -#else
 -$2 $1 ();
 -#endif[]dnl
 -])
 -
 -
  
  ## --------------------- ##
  ## Calling C functions.  ##
  ## --------------------- ##
  
  
 -# b4_c_function_call(NAME, RETURN-VALUE, [DECL1, NAME1], ...)
 +# b4_function_call(NAME, RETURN-VALUE, [DECL1, NAME1], ...)
  # -----------------------------------------------------------
  # Call the function NAME with arguments NAME1, NAME2 etc.
 -m4_define([b4_c_function_call],
 -[$1 (b4_c_args(m4_shift2($@)))[]dnl
 +m4_define([b4_function_call],
 +[$1 (b4_args(m4_shift2($@)))[]dnl
  ])
  
  
 -# b4_c_args([DECL1, NAME1], ...)
 -# ------------------------------
 +# b4_args([DECL1, NAME1], ...)
 +# ----------------------------
  # Output the arguments NAME1, NAME2...
 -m4_define([b4_c_args],
 -[m4_map_sep([b4_c_arg], [, ], [$@])])
 +m4_define([b4_args],
 +[m4_map_sep([b4_arg], [, ], [$@])])
  
 -m4_define([b4_c_arg],
 +m4_define([b4_arg],
  [$2])
  
  
  ## ----------- ##
  
  # b4_sync_start(LINE, FILE)
 -# -----------------------
 +# -------------------------
  m4_define([b4_sync_start], [[#]line $1 $2])
  
  
  m4_define([b4_case],
  [  case $1:
  $2
 +b4_syncline([@oline@], [@ofile@])
      break;])
  
 -# b4_symbol_actions(FILENAME, LINENO,
 -#                   SYMBOL-TAG, SYMBOL-NUM,
 -#                   SYMBOL-ACTION, SYMBOL-TYPENAME)
 -# -------------------------------------------------
 -# Issue the code for a symbol action (e.g., %printer).
 -#
 -# Define b4_dollar_dollar([TYPE-NAME]), and b4_at_dollar, which are
 -# invoked where $<TYPE-NAME>$ and @$ were specified by the user.
 -m4_define([b4_symbol_actions],
 -[b4_dollar_pushdef([(*yyvaluep)], [$6], [(*yylocationp)])dnl
 -      case $4: /* $3 */
 -b4_syncline([$2], [$1])
 -        $5;
 +
 +# b4_predicate_case(LABEL, CONDITIONS)
 +# ------------------------------------
 +m4_define([b4_predicate_case],
 +[  case $1:
 +    if (! ($2)) YYERROR;
  b4_syncline([@oline@], [@ofile@])
 -        break;
 -b4_dollar_popdef[]dnl
 -])
 +    break;])
  
  
 -# b4_yydestruct_generate(FUNCTION-DECLARATOR)
 -# -------------------------------------------
 -# Generate the "yydestruct" function, which declaration is issued using
 -# FUNCTION-DECLARATOR, which may be "b4_c_ansi_function_def" for ISO C
 -# or "b4_c_function_def" for K&R.
 -m4_define_default([b4_yydestruct_generate],
 +# b4_yydestruct_define
 +# --------------------
 +# Define the "yydestruct" function.
 +m4_define_default([b4_yydestruct_define],
  [[/*-----------------------------------------------.
  | Release the memory associated to this symbol.  |
  `-----------------------------------------------*/
  
 -/*ARGSUSED*/
 -]$1([yydestruct],
 +]b4_function_define([yydestruct],
      [static void],
      [[const char *yymsg],    [yymsg]],
      [[int yytype],           [yytype]],
  b4_locations_if(            [, [[YYLTYPE *yylocationp], [yylocationp]]])[]dnl
  m4_ifset([b4_parse_param], [, b4_parse_param]))[
  {
 -  YYUSE (yyvaluep);
 -]b4_locations_if([  YYUSE (yylocationp);
 -])dnl
 -b4_parse_param_use[]dnl
 -[
 -  if (!yymsg)
 +]b4_parse_param_use([yyvaluep], [yylocationp])dnl
 +[  if (!yymsg)
      yymsg = "Deleting";
    YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
  
    switch (yytype)
      {
 -]m4_map([b4_symbol_actions], m4_defn([b4_symbol_destructors]))[
 -      default:
 +]b4_symbol_foreach([b4_symbol_destructor])dnl
 +[      default:
          break;
      }
  }]dnl
  ])
  
  
 -# b4_yy_symbol_print_generate(FUNCTION-DECLARATOR)
 -# ------------------------------------------------
 -# Generate the "yy_symbol_print" function, which declaration is issued using
 -# FUNCTION-DECLARATOR, which may be "b4_c_ansi_function_def" for ISO C
 -# or "b4_c_function_def" for K&R.
 -m4_define_default([b4_yy_symbol_print_generate],
 +# b4_yy_symbol_print_define
 +# -------------------------
 +# Define the "yy_symbol_print" function.
 +m4_define_default([b4_yy_symbol_print_define],
  [[
  /*--------------------------------.
  | Print this symbol on YYOUTPUT.  |
  `--------------------------------*/
  
 -/*ARGSUSED*/
 -]$1([yy_symbol_value_print],
 +]b4_function_define([yy_symbol_value_print],
      [static void],
                 [[FILE *yyoutput],                       [yyoutput]],
                 [[int yytype],                           [yytype]],
@@@ -457,19 -498,21 +457,19 @@@ b4_locations_if([, [[YYLTYPE const * co
  m4_ifset([b4_parse_param], [, b4_parse_param]))[
  {
    FILE *yyo = yyoutput;
 -  YYUSE (yyo);
 -  if (!yyvaluep)
 -    return;
 -]b4_locations_if([  YYUSE (yylocationp);
 -])dnl
 -b4_parse_param_use[]dnl
 -[# ifdef YYPRINT
 +]b4_parse_param_use([yyo], [yylocationp])dnl
 +[  if (!yyvaluep)
 +    return;]
 +dnl glr.c does not feature yytoknum.
 +m4_if(b4_skeleton, ["yacc.c"],
 +[[# ifdef YYPRINT
    if (yytype < YYNTOKENS)
      YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
 -# else
 -  YYUSE (yyoutput);
  # endif
 -  switch (yytype)
 +]])dnl
 +[  switch (yytype)
      {
 -]m4_map([b4_symbol_actions], m4_defn([b4_symbol_printers]))dnl
 +]b4_symbol_foreach([b4_symbol_printer])dnl
  [      default:
          break;
      }
  | Print this symbol on YYOUTPUT.  |
  `--------------------------------*/
  
 -]$1([yy_symbol_print],
 +]b4_function_define([yy_symbol_print],
      [static void],
                 [[FILE *yyoutput],                       [yyoutput]],
                 [[int yytype],                           [yytype]],
@@@ -521,6 -564,7 +521,6 @@@ m4_define([b4_declare_yylstype]
  [m4_if(b4_tag_seen_flag, 0,
  [[typedef int ]b4_api_PREFIX[STYPE;
  # define ]b4_api_PREFIX[STYPE_IS_TRIVIAL 1]])])[
 -# define ]b4_api_prefix[stype ]b4_api_PREFIX[STYPE /* obsolescent; will be withdrawn */
  # define ]b4_api_PREFIX[STYPE_IS_DECLARED 1
  #endif]b4_locations_if([[
  
@@@ -532,6 -576,7 +532,6 @@@ typedef struct ]b4_api_PREFIX[LTYP
    int last_line;
    int last_column;
  } ]b4_api_PREFIX[LTYPE;
 -# define ]b4_api_prefix[ltype ]b4_api_PREFIX[LTYPE /* obsolescent; will be withdrawn */
  # define ]b4_api_PREFIX[LTYPE_IS_DECLARED 1
  # define ]b4_api_PREFIX[LTYPE_IS_TRIVIAL 1
  #endif]])
@@@ -546,17 -591,17 +546,17 @@@ m4_define([b4_YYDEBUG_define]
  [[/* Enabling traces.  */
  ]m4_if(b4_api_prefix, [yy],
  [[#ifndef YYDEBUG
 -# define YYDEBUG ]b4_debug_flag[
 +# define YYDEBUG ]b4_parse_trace_if([1], [0])[
  #endif]],
  [[#ifndef ]b4_api_PREFIX[DEBUG
  # if defined YYDEBUG
 -#  if YYDEBUG
 +#if YYDEBUG
  #   define ]b4_api_PREFIX[DEBUG 1
  #  else
  #   define ]b4_api_PREFIX[DEBUG 0
  #  endif
  # else /* ! defined YYDEBUG */
 -#  define ]b4_api_PREFIX[DEBUG ]b4_debug_flag[
 +#  define ]b4_api_PREFIX[DEBUG ]b4_parse_trace_if([1], [0])[
  # endif /* ! defined YYDEBUG */
  #endif  /* ! defined ]b4_api_PREFIX[DEBUG */]])[]dnl
  ])
@@@ -581,7 -626,7 +581,7 @@@ m4_define([b4_yylloc_default_define]
  #ifndef YYLLOC_DEFAULT
  # define YYLLOC_DEFAULT(Current, Rhs, N)                                \
      do                                                                  \
 -      if (YYID (N))                                                     \
 +      if (N)                                                            \
          {                                                               \
            (Current).first_line   = YYRHSLOC (Rhs, 1).first_line;        \
            (Current).first_column = YYRHSLOC (Rhs, 1).first_column;      \
            (Current).first_column = (Current).last_column =              \
              YYRHSLOC (Rhs, 0).last_column;                              \
          }                                                               \
 -    while (YYID (0))
 +    while (0)
  #endif
  ]])
  
@@@ -610,14 -655,40 +610,40 @@@ m4_define([b4_yy_location_print_define]
  
  #ifndef YY_LOCATION_PRINT
  # if defined ]b4_api_PREFIX[LTYPE_IS_TRIVIAL && ]b4_api_PREFIX[LTYPE_IS_TRIVIAL
 -]b4_c_function_def([yy_location_print_],
+ /* Print *YYLOCP on YYO.  Private, do not rely on its existence. */
+ __attribute__((__unused__))
 -#  define YY_LOCATION_PRINT(File, Loc)          \
++]b4_function_define([yy_location_print_],
+     [static unsigned],
+                [[FILE *yyo],                    [yyo]],
+                [[YYLTYPE const * const yylocp], [yylocp]])[
+ {
+   unsigned res = 0;
+   int end_col = 0 != yylocp->last_column ? yylocp->last_column - 1 : 0;
+   if (0 <= yylocp->first_line)
+     {
+       res += fprintf (yyo, "%d", yylocp->first_line);
+       if (0 <= yylocp->first_column)
+         res += fprintf (yyo, ".%d", yylocp->first_column);
+     }
+   if (0 <= yylocp->last_line)
+     {
+       if (yylocp->first_line < yylocp->last_line)
+         {
+           res += fprintf (yyo, "-%d", yylocp->last_line);
+           if (0 <= end_col)
+             res += fprintf (yyo, ".%d", end_col);
+         }
+       else if (0 <= end_col && yylocp->first_column < end_col)
+         res += fprintf (yyo, "-%d", end_col);
+     }
+   return res;
+  }
-   do {                                                                   \
-     fprintf (File, "%d.%d", (Loc).first_line, (Loc).first_column);       \
-     if ((Loc).first_line < (Loc).last_line)                              \
-       fprintf (File, "-%d.%d", (Loc).last_line,  (Loc).last_column - 1); \
-     else if ((Loc).first_column < (Loc).last_column - 1)                 \
-       fprintf (File, "-%d", (Loc).last_column - 1);                      \
-   } while (0)
 +#  define YY_LOCATION_PRINT(File, Loc)                                   \
+   yy_location_print_ (File, &(Loc))
  # else
  #  define YY_LOCATION_PRINT(File, Loc) ((void) 0)
  # endif
diff --combined data/glr.c
index 9038c7475d0d42e66829154d9f608862d4786cb1,cdefd5070e06dd6b3e6d373ec5a0ed18c0938fb0..1e82e5891ff472b1ce75c9cae3bf8b2cca979f02
@@@ -52,7 -52,7 +52,7 @@@ m4_ifndef([b4_pure_flag]
  # This is not shared with yacc.c in c.m4 because  GLR relies on ISO C
  # formal argument declarations.
  m4_define([b4_user_formals],
 -[m4_ifset([b4_parse_param], [, b4_c_ansi_formals(b4_parse_param)])])
 +[m4_ifset([b4_parse_param], [, b4_formals(b4_parse_param)])])
  
  
  # b4_lex_param
@@@ -71,7 -71,7 +71,7 @@@ m4_ifdef([b4_lex_param], [, ]b4_lex_par
  # a trailing comma.
  m4_define([b4_yyerror_args],
  [b4_pure_if([b4_locations_if([yylocp, ])])dnl
 -m4_ifset([b4_parse_param], [b4_c_args(b4_parse_param), ])])
 +m4_ifset([b4_parse_param], [b4_args(b4_parse_param), ])])
  
  
  # b4_lyyerror_args
@@@ -79,7 -79,7 +79,7 @@@
  # Same as above, but on the lookahead, hence &yylloc instead of yylocp.
  m4_define([b4_lyyerror_args],
  [b4_pure_if([b4_locations_if([&yylloc, ])])dnl
 -m4_ifset([b4_parse_param], [b4_c_args(b4_parse_param), ])])
 +m4_ifset([b4_parse_param], [b4_args(b4_parse_param), ])])
  
  
  # b4_pure_args
@@@ -126,15 -126,7 +126,15 @@@ m4_define([b4_locuser_args]
  # --------------------
  # Expansion of $<TYPE>$.
  m4_define([b4_lhs_value],
 -[((*yyvalp)[]m4_ifval([$1], [.$1]))])
 +[b4_symbol_value([(*yyvalp)], [$1])])
 +
 +
 +# b4_rhs_data(RULE-LENGTH, NUM)
 +# -----------------------------
 +# Expand to the semantic stack place that contains value and location
 +# of symbol number NUM in a rule of length RULE-LENGTH.
 +m4_define([b4_rhs_data],
 +[((yyGLRStackItem const *)yyvsp)@{YYFILL (b4_subtract([$2], [$1]))@}.yystate])
  
  
  # b4_rhs_value(RULE-LENGTH, NUM, [TYPE])
  # Expansion of $<TYPE>NUM, where the current rule has RULE-LENGTH
  # symbols on RHS.
  m4_define([b4_rhs_value],
 -[(((yyGLRStackItem const *)yyvsp)@{YYFILL (($2) - ($1))@}.yystate.yysemantics.yysval[]m4_ifval([$3], [.$3]))])
 +[b4_symbol_value([b4_rhs_data([$1], [$2]).yysemantics.yysval], [$3])])
  
  
  
@@@ -162,7 -154,7 +162,7 @@@ m4_define([b4_lhs_location]
  # Expansion of @NUM, where the current rule has RULE-LENGTH symbols
  # on RHS.
  m4_define([b4_rhs_location],
 -[(((yyGLRStackItem const *)yyvsp)@{YYFILL (($2) - ($1))@}.yystate.yyloc)])
 +[(b4_rhs_data([$1], [$2]).yyloc)])
  
  
  ## -------------- ##
  # b4_shared_declarations
  # ----------------------
  # Declaration that might either go into the header (if --defines)
 -# or open coded in the parser body.
 -m4_define([b4_shared_declarations],
 +# or open coded in the parser body.  glr.cc has its own definition.
 +m4_if(b4_skeleton, ["glr.c"],
 +[m4_define([b4_shared_declarations],
  [b4_declare_yydebug[
  ]b4_percent_code_get([[requires]])[
 -]b4_token_enums(b4_tokens)[
 +]b4_token_enums[
  ]b4_declare_yylstype[
 -]b4_c_ansi_function_decl(b4_prefix[parse], [int], b4_parse_param)[
 +]b4_function_declare(b4_prefix[parse], [int], b4_parse_param)[
  ]b4_percent_code_get([[provides]])[]dnl
  ])
 -
 +])
  
  ## -------------- ##
  ## Output files.  ##
  ## -------------- ##
  
- # We do want M4 expansion after # for CPP macros.
- m4_changecom()
- m4_divert_push(0)dnl
- @output(b4_parser_file_name@)@
+ b4_output_begin([b4_parser_file_name])
  b4_copyright([Skeleton implementation for Bison GLR parsers in C],
-              [2002-2012])
- [
+              [2002-2012])[
  /* C GLR parser skeleton written by Paul Hilfinger.  */
  
  ]b4_identification
@@@ -215,7 -203,7 +212,7 @@@ b4_percent_code_get([[top]])
  #define yynerrs ]b4_prefix[nerrs]b4_locations_if([[
  #define yylloc  ]b4_prefix[lloc]])])[
  
 -/* Copy the first part of user declarations.  */
 +/* First part of user declarations.  */
  ]b4_user_pre_prologue[
  
  ]b4_null_define[
  # undef YYERROR_VERBOSE
  # define YYERROR_VERBOSE 1
  #else
 -# define YYERROR_VERBOSE ]b4_error_verbose_flag[
 +# define YYERROR_VERBOSE ]b4_error_verbose_if([1], [0])[
  #endif
  
  /* Default (constant) value used for initialization for null
@@@ -259,12 -247,22 +256,12 @@@ b4_percent_code_get[]dn
  #endif
  
  /* Suppress unused-variable warnings by "using" E.  */
 -#if ! defined lint || defined __GNUC__
 +#ifdef __GNUC__
  # define YYUSE(E) ((void) (E))
  #else
  # define YYUSE(E) /* empty */
  #endif
  
 -/* Identity function, used to suppress warnings about constant conditions.  */
 -#ifndef lint
 -# define YYID(N) (N)
 -#else
 -]b4_c_function_def([YYID], [static int], [[int i], [i]])[
 -{
 -  return i;
 -}
 -#endif
 -
  #ifndef YYFREE
  # define YYFREE free
  #endif
  # endif
  #endif
  
- ]b4_locations_if([#define YYOPTIONAL_LOC(Name) Name],[
- #ifdef __cplusplus
- # define YYOPTIONAL_LOC(Name) /* empty */
- #else
- # define YYOPTIONAL_LOC(Name) Name __attribute__ ((__unused__))
- #endif])[
  #ifndef YYASSERT
  # define YYASSERT(Condition) ((void) ((Condition) || (abort (), 0)))
  #endif
@@@ -349,6 -340,19 +339,6 @@@ static const ]b4_int_type_for([b4_trans
  };
  
  #if ]b4_api_PREFIX[DEBUG
 -/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
 -   YYRHS.  */
 -static const ]b4_int_type_for([b4_prhs])[ yyprhs[] =
 -{
 -  ]b4_prhs[
 -};
 -
 -/* YYRHS -- A `-1'-separated list of the rules' RHS.  */
 -static const ]b4_int_type_for([b4_rhs])[ yyrhs[] =
 -{
 -  ]b4_rhs[
 -};
 -
  /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
  static const ]b4_int_type_for([b4_rline])[ yyrline[] =
  {
@@@ -365,10 -369,17 +355,10 @@@ static const char *const yytname[] 
  };
  #endif
  
 -/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
 -static const ]b4_int_type_for([b4_r1])[ yyr1[] =
 -{
 -  ]b4_r1[
 -};
 +#define YYPACT_NINF ]b4_pact_ninf[
 +#define YYTABLE_NINF ]b4_table_ninf[
  
 -/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
 -static const ]b4_int_type_for([b4_r2])[ yyr2[] =
 -{
 -  ]b4_r2[
 -};
 +]b4_parser_tables_define[
  
  /* YYDPREC[RULE-NUM] -- Dynamic precedence of rule #RULE-NUM (0 if none).  */
  static const ]b4_int_type_for([b4_dprec])[ yydprec[] =
@@@ -382,11 -393,41 +372,11 @@@ static const ]b4_int_type_for([b4_merge
    ]b4_merger[
  };
  
 -/* YYDEFACT[S] -- default reduction number in state S.  Performed when
 -   YYTABLE doesn't specify something else to do.  Zero means the default
 -   is an error.  */
 -static const ]b4_int_type_for([b4_defact])[ yydefact[] =
 -{
 -  ]b4_defact[
 -};
 -
 -/* YYPDEFGOTO[NTERM-NUM].  */
 -static const ]b4_int_type_for([b4_defgoto])[ yydefgoto[] =
 -{
 -  ]b4_defgoto[
 -};
 -
 -/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
 -   STATE-NUM.  */
 -#define YYPACT_NINF ]b4_pact_ninf[
 -static const ]b4_int_type_for([b4_pact])[ yypact[] =
 -{
 -  ]b4_pact[
 -};
 -
 -/* YYPGOTO[NTERM-NUM].  */
 -static const ]b4_int_type_for([b4_pgoto])[ yypgoto[] =
 -{
 -  ]b4_pgoto[
 -};
 -
 -/* 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.  */
 -#define YYTABLE_NINF ]b4_table_ninf[
 -static const ]b4_int_type_for([b4_table])[ yytable[] =
 +/* YYIMMEDIATE[RULE-NUM] -- True iff rule #RULE-NUM is not to be deferred, as
 +   in the case of predicates.  */
 +static const yybool yyimmediate[] =
  {
 -  ]b4_table[
 +  ]b4_immediate[
  };
  
  /* YYCONFLP[YYPACT[STATE-NUM]] -- Pointer into YYCONFL of start of
@@@ -408,6 -449,18 +398,6 @@@ dnl We probably ought to introduce a ty
    ]b4_conflicting_rules[
  };
  
 -static const ]b4_int_type_for([b4_check])[ yycheck[] =
 -{
 -  ]b4_check[
 -};
 -
 -/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
 -   symbol of state STATE-NUM.  */
 -static const ]b4_int_type_for([b4_stos])[ yystos[] =
 -{
 -  ]b4_stos[
 -};
 -
  /* Error token number */
  #define YYTERROR 1
  
  ]b4_yy_location_print_define[
  
  /* YYLEX -- calling `yylex' with the right arguments.  */
 -#define YYLEX ]b4_c_function_call([yylex], [int], b4_lex_param)[
 +#define YYLEX ]b4_function_call([yylex], [int], b4_lex_param)[
  
  ]b4_pure_if(
  [
@@@ -446,12 -499,9 +436,12 @@@ static const int YYEMPTY = -2
  
  typedef enum { yyok, yyaccept, yyabort, yyerr } YYRESULTTAG;
  
 -#define YYCHK(YYE)                                                           \
 -   do { YYRESULTTAG yyflag = YYE; if (yyflag != yyok) return yyflag; }       \
 -   while (YYID (0))
 +#define YYCHK(YYE)                              \
 +  do {                                          \
 +    YYRESULTTAG yychk_flag = YYE;               \
 +    if (yychk_flag != yyok)                     \
 +      return yychk_flag;                        \
 +  } while (0)
  
  #if ]b4_api_PREFIX[DEBUG
  
  # endif
  
  # define YYDPRINTF(Args)                        \
 -do {                                            \
 -  if (yydebug)                                  \
 -    YYFPRINTF Args;                             \
 -} while (YYID (0))
 -
 -]b4_yy_symbol_print_generate([b4_c_ansi_function_def])[
 -
 -# define YY_SYMBOL_PRINT(Title, Type, Value, Location)          \
 -do {                                                            \
 -  if (yydebug)                                                  \
 -    {                                                           \
 -      YYFPRINTF (stderr, "%s ", Title);                         \
 -      yy_symbol_print (stderr, Type, Value]b4_locuser_args([Location])[);        \
 -      YYFPRINTF (stderr, "\n");                                 \
 -    }                                                           \
 -} while (YYID (0))
 +  do {                                          \
 +    if (yydebug)                                \
 +      YYFPRINTF Args;                           \
 +  } while (0)
 +
 +]b4_yy_symbol_print_define[
 +
 +# define YY_SYMBOL_PRINT(Title, Type, Value, Location)                  \
 +  do {                                                                  \
 +    if (yydebug)                                                        \
 +      {                                                                 \
 +        YYFPRINTF (stderr, "%s ", Title);                               \
 +        yy_symbol_print (stderr, Type, Value]b4_locuser_args([Location])[);        \
 +        YYFPRINTF (stderr, "\n");                                       \
 +      }                                                                 \
 +  } while (0)
  
  /* Nonzero means print parse trace.  It is left uninitialized so that
     multiple parsers can coexist.  */
@@@ -512,7 -562,13 +502,7 @@@ int yydebug
  #define YYHEADROOM 2
  
  #ifndef YYSTACKEXPANDABLE
 -# if (! defined __cplusplus \
 -      || (]b4_locations_if([[defined ]b4_api_PREFIX[LTYPE_IS_TRIVIAL && ]b4_api_PREFIX[LTYPE_IS_TRIVIAL \
 -          && ]])[defined ]b4_api_PREFIX[STYPE_IS_TRIVIAL && ]b4_api_PREFIX[STYPE_IS_TRIVIAL))
  #  define YYSTACKEXPANDABLE 1
 -# else
 -#  define YYSTACKEXPANDABLE 0
 -# endif
  #endif
  
  #if YYSTACKEXPANDABLE
    do {                                                  \
      if (Yystack->yyspaceLeft < YYHEADROOM)              \
        yyexpandGLRStack (Yystack);                       \
 -  } while (YYID (0))
 +  } while (0)
  #else
  # define YY_RESERVE_GLRSTACK(Yystack)                   \
    do {                                                  \
      if (Yystack->yyspaceLeft < YYHEADROOM)              \
        yyMemoryExhausted (Yystack);                      \
 -  } while (YYID (0))
 +  } while (0)
  #endif
  
  
@@@ -609,7 -665,7 +599,7 @@@ typedef int yyStateNum
  typedef int yyRuleNum;
  
  /** Grammar symbol */
 -typedef short int yySymbol;
 +typedef int yySymbol;
  
  /** Item references, as in LALR(1) machine */
  typedef short int yyItemNum;
@@@ -630,7 -686,7 +620,7 @@@ struct yyGLRState 
    yyStateNum yylrState;
    /** Preceding state in this stack */
    yyGLRState* yypred;
 -  /** Source position of the first token produced by my symbol */
 +  /** Source position of the last token produced by my symbol */
    size_t yyposn;
    union {
      /** First in a chain of alternative reductions producing the
@@@ -742,16 -798,9 +732,16 @@@ yyfillin (yyGLRStackItem *yyvsp, int yy
    yyGLRState *s = yyvsp[yylow0].yystate.yypred;
    for (i = yylow0-1; i >= yylow1; i -= 1)
      {
 -      YYASSERT (s->yyresolved);
 -      yyvsp[i].yystate.yyresolved = yytrue;
 -      yyvsp[i].yystate.yysemantics.yysval = s->yysemantics.yysval;]b4_locations_if([[
 +#if ]b4_api_PREFIX[DEBUG
 +      yyvsp[i].yystate.yylrState = s->yylrState;
 +#endif
 +      yyvsp[i].yystate.yyresolved = s->yyresolved;
 +      if (s->yyresolved)
 +        yyvsp[i].yystate.yysemantics.yysval = s->yysemantics.yysval;
 +      else
 +        /* The effect of using yysval or yyloc (in an immediate rule) is
 +         * undefined.  */
 +        yyvsp[i].yystate.yysemantics.yyfirstVal = YY_NULL;]b4_locations_if([[
        yyvsp[i].yystate.yyloc = s->yyloc;]])[
        s = yyvsp[i].yystate.yypred = s->yypred;
      }
@@@ -778,7 -827,7 +768,7 @@@ yyfill (yyGLRStackItem *yyvsp, int *yyl
   *  value ($$), and yylocp points to place for location information
   *  (@@$).  Returns yyok for normal return, yyaccept for YYACCEPT,
   *  yyerr for YYERROR, yyabort for YYABORT.  */
 -/*ARGSUSED*/ static YYRESULTTAG
 +static YYRESULTTAG
  yyuserAction (yyRuleNum yyn, int yyrhslen, yyGLRStackItem* yyvsp,
                yyGLRStack* yystackp,
                YYSTYPE* yyvalp]b4_locuser_formals[)
    yybool yynormal __attribute__ ((__unused__)) =
      (yystackp->yysplitPoint == YY_NULL);
    int yylow;
 -]b4_parse_param_use[]dnl
 +]b4_parse_param_use([yyvalp], [yylocp])dnl
  [# undef yyerrok
  # define yyerrok (yystackp->yyerrState = 0)
  # undef YYACCEPT
  # undef yyclearin
  # undef YYRECOVERING
  }
 -\f
  
 -/*ARGSUSED*/ static void
 +
 +static void
  yyuserMerge (int yyn, YYSTYPE* yy0, YYSTYPE* yy1)
  {
    YYUSE (yy0);
  
    switch (yyn)
      {
 -      ]b4_mergers[
 +]b4_mergers[
        default: break;
      }
  }
  
                                /* Bison grammar-table manipulation.  */
  
 -]b4_yydestruct_generate([b4_c_ansi_function_def])[
 +]b4_yydestruct_define[
  
  /** Number of symbols composing the right hand side of rule #RULE.  */
  static inline int
@@@ -889,7 -938,7 +879,7 @@@ yydestroyGLRState (char const *yymsg, y
      }
  }
  
 -/** Left-hand-side symbol for rule #RULE.  */
 +/** Left-hand-side symbol for rule #YYRULE.  */
  static inline yySymbol
  yylhsNonterm (yyRuleNum yyrule)
  {
  #define yypact_value_is_default(Yystate) \
    ]b4_table_value_equals([[pact]], [[Yystate]], [b4_pact_ninf])[
  
 -/** True iff LR state STATE has only a default reduction (regardless
 +/** True iff LR state YYSTATE has only a default reduction (regardless
   *  of token).  */
  static inline yybool
  yyisDefaultedState (yyStateNum yystate)
    return yypact_value_is_default (yypact[yystate]);
  }
  
 -/** The default reduction for STATE, assuming it has one.  */
 +/** The default reduction for YYSTATE, assuming it has one.  */
  static inline yyRuleNum
  yydefaultAction (yyStateNum yystate)
  {
   *    R < 0:  Reduce on rule -R.
   *    R = 0:  Error.
   *    R > 0:  Shift to state R.
 - *  Set *CONFLICTS to a pointer into yyconfl to 0-terminated list of
 - *  conflicting reductions.
 + *  Set *YYCONFLICTS to a pointer into yyconfl to a 0-terminated list
 + *  of conflicting reductions.
   */
  static inline void
  yygetLRActions (yyStateNum yystate, int yytoken,
  static inline yyStateNum
  yyLRgotoState (yyStateNum yystate, yySymbol yylhs)
  {
 -  int yyr;
 -  yyr = yypgoto[yylhs - YYNTOKENS] + yystate;
 +  int yyr = yypgoto[yylhs - YYNTOKENS] + yystate;
    if (0 <= yyr && yyr <= YYLAST && yycheck[yyr] == yystate)
      return yytable[yyr];
    else
@@@ -972,10 -1022,9 +962,10 @@@ yyisErrorAction (int yyaction
  
                                  /* GLRStates */
  
 -/** Return a fresh GLRStackItem.  Callers should call
 - * YY_RESERVE_GLRSTACK afterwards to make sure there is sufficient
 - * headroom.  */
 +/** Return a fresh GLRStackItem in YYSTACKP.  The item is an LR state
 + *  if YYISSTATE, and otherwise a semantic option.  Callers should call
 + *  YY_RESERVE_GLRSTACK afterwards to make sure there is sufficient
 + *  headroom.  */
  
  static inline yyGLRStackItem*
  yynewGLRStackItem (yyGLRStack* yystackp, yybool yyisState)
  }
  
  /** Add a new semantic action that will execute the action for rule
 - *  RULENUM on the semantic values in RHS to the list of
 - *  alternative actions for STATE.  Assumes that RHS comes from
 - *  stack #K of *STACKP. */
 + *  YYRULE on the semantic values in YYRHS to the list of
 + *  alternative actions for YYSTATE.  Assumes that YYRHS comes from
 + *  stack #YYK of *YYSTACKP. */
  static void
  yyaddDeferredAction (yyGLRStack* yystackp, size_t yyk, yyGLRState* yystate,
 -                     yyGLRState* rhs, yyRuleNum yyrule)
 +                     yyGLRState* yyrhs, yyRuleNum yyrule)
  {
    yySemanticOption* yynewOption =
      &yynewGLRStackItem (yystackp, yyfalse)->yyoption;
 -  yynewOption->yystate = rhs;
 +  yynewOption->yystate = yyrhs;
    yynewOption->yyrule = yyrule;
    if (yystackp->yytops.yylookaheadNeeds[yyk])
      {
  
                                  /* GLRStacks */
  
 -/** Initialize SET to a singleton set containing an empty stack.  */
 +/** Initialize YYSET to a singleton set containing an empty stack.  */
  static yybool
  yyinitStateSet (yyGLRStateSet* yyset)
  {
@@@ -1041,8 -1090,8 +1031,8 @@@ static void yyfreeStateSet (yyGLRStateS
    YYFREE (yyset->yylookaheadNeeds);
  }
  
 -/** Initialize STACK to a single empty stack, with total maximum
 - *  capacity for all stacks of SIZE.  */
 +/** Initialize *YYSTACKP to a single empty stack, with total maximum
 + *  capacity for all stacks of YYSIZE.  */
  static yybool
  yyinitGLRStack (yyGLRStack* yystackp, size_t yysize)
  {
  # define YYRELOC(YYFROMITEMS,YYTOITEMS,YYX,YYTYPE) \
    &((YYTOITEMS) - ((YYFROMITEMS) - (yyGLRStackItem*) (YYX)))->YYTYPE
  
 -/** If STACK is expandable, extend it.  WARNING: Pointers into the
 +/** If *YYSTACKP is expandable, extend it.  WARNING: Pointers into the
      stack from outside should be considered invalid after this call.
      We always expand when there are 1 or fewer items left AFTER an
      allocation, so that we can avoid having external pointers exist
@@@ -1134,9 -1183,9 +1124,9 @@@ yyfreeGLRStack (yyGLRStack* yystackp
    yyfreeStateSet (&yystackp->yytops);
  }
  
 -/** Assuming that S is a GLRState somewhere on STACK, update the
 - *  splitpoint of STACK, if needed, so that it is at least as deep as
 - *  S.  */
 +/** Assuming that YYS is a GLRState somewhere on *YYSTACKP, update the
 + *  splitpoint of *YYSTACKP, if needed, so that it is at least as deep as
 + *  YYS.  */
  static inline void
  yyupdateSplit (yyGLRStack* yystackp, yyGLRState* yys)
  {
      yystackp->yysplitPoint = yys;
  }
  
 -/** Invalidate stack #K in STACK.  */
 +/** Invalidate stack #YYK in *YYSTACKP.  */
  static inline void
  yymarkStackDeleted (yyGLRStack* yystackp, size_t yyk)
  {
    yystackp->yytops.yystates[yyk] = YY_NULL;
  }
  
 -/** Undelete the last stack that was marked as deleted.  Can only be
 -    done once after a deletion, and only when all other stacks have
 +/** Undelete the last stack in *YYSTACKP that was marked as deleted.  Can
 +    only be done once after a deletion, and only when all other stacks have
      been deleted.  */
  static void
  yyundeleteLastStack (yyGLRStack* yystackp)
@@@ -1203,9 -1252,8 +1193,9 @@@ yyremoveDeletes (yyGLRStack* yystackp
      }
  }
  
 -/** Shift to a new state on stack #K of STACK, corresponding to LR state
 - * LRSTATE, at input position POSN, with (resolved) semantic value SVAL.  */
 +/** Shift to a new state on stack #YYK of *YYSTACKP, corresponding to LR
 + * state YYLRSTATE, at input position YYPOSN, with (resolved) semantic
 + * value *YYVALP and source location *YYLOCP.  */
  static inline void
  yyglrShift (yyGLRStack* yystackp, size_t yyk, yyStateNum yylrState,
              size_t yyposn,
    YY_RESERVE_GLRSTACK (yystackp);
  }
  
 -/** Shift stack #K of YYSTACK, to a new state corresponding to LR
 +/** Shift stack #YYK of *YYSTACKP, to a new state corresponding to LR
   *  state YYLRSTATE, at input position YYPOSN, with the (unresolved)
   *  semantic value of YYRHS under the action for YYRULE.  */
  static inline void
  yyglrShiftDefer (yyGLRStack* yystackp, size_t yyk, yyStateNum yylrState,
 -                 size_t yyposn, yyGLRState* rhs, yyRuleNum yyrule)
 +                 size_t yyposn, yyGLRState* yyrhs, yyRuleNum yyrule)
  {
    yyGLRState* yynewState = &yynewGLRStackItem (yystackp, yytrue)->yystate;
  
    yystackp->yytops.yystates[yyk] = yynewState;
  
    /* Invokes YY_RESERVE_GLRSTACK.  */
 -  yyaddDeferredAction (yystackp, yyk, yynewState, rhs, yyrule);
 +  yyaddDeferredAction (yystackp, yyk, yynewState, yyrhs, yyrule);
  }
  
 -/** Pop the symbols consumed by reduction #RULE from the top of stack
 - *  #K of STACK, and perform the appropriate semantic action on their
 +#if !]b4_api_PREFIX[DEBUG
 +# define YY_REDUCE_PRINT(Args)
 +#else
 +# define YY_REDUCE_PRINT(Args)          \
 +do {                                    \
 +  if (yydebug)                          \
 +    yy_reduce_print Args;               \
 +} while (0)
 +
 +/*----------------------------------------------------------------------.
 +| Report that stack #YYK of *YYSTACKP is going to be reduced by YYRULE. |
 +`----------------------------------------------------------------------*/
 +
 +static inline void
 +yy_reduce_print (int yynormal, yyGLRStackItem* yyvsp, size_t yyk,
 +                 yyRuleNum yyrule]b4_user_formals[)
 +{
 +  int yynrhs = yyrhsLength (yyrule);]b4_locations_if([
 +  int yylow = 1;])[
 +  int yyi;
 +  YYFPRINTF (stderr, "Reducing stack %lu by rule %d (line %lu):\n",
 +             (unsigned long int) yyk, yyrule - 1,
 +             (unsigned long int) yyrline[yyrule]);
 +  if (! yynormal)
 +    yyfillin (yyvsp, 1, -yynrhs);
 +  /* The symbols being reduced.  */
 +  for (yyi = 0; yyi < yynrhs; yyi++)
 +    {
 +      YYFPRINTF (stderr, "   $%d = ", yyi + 1);
 +      yy_symbol_print (stderr,
 +                       yystos[yyvsp[yyi - yynrhs + 1].yystate.yylrState],
 +                       &yyvsp[yyi - yynrhs + 1].yystate.yysemantics.yysval
 +                       ]b4_locations_if([, &]b4_rhs_location(yynrhs, yyi + 1))[]dnl
 +                       b4_user_args[);
 +      if (!yyvsp[yyi - yynrhs + 1].yystate.yyresolved)
 +        YYFPRINTF (stderr, " (unresolved)");
 +      YYFPRINTF (stderr, "\n");
 +    }
 +}
 +#endif
 +
 +/** Pop the symbols consumed by reduction #YYRULE from the top of stack
 + *  #YYK of *YYSTACKP, and perform the appropriate semantic action on their
   *  semantic values.  Assumes that all ambiguities in semantic values
 - *  have been previously resolved.  Set *VALP to the resulting value,
 - *  and *LOCP to the computed location (if any).  Return value is as
 + *  have been previously resolved.  Set *YYVALP to the resulting value,
 + *  and *YYLOCP to the computed location (if any).  Return value is as
   *  for userAction.  */
  static inline YYRESULTTAG
  yydoAction (yyGLRStack* yystackp, size_t yyk, yyRuleNum yyrule,
    if (yystackp->yysplitPoint == YY_NULL)
      {
        /* Standard special case: single stack.  */
 -      yyGLRStackItem* rhs = (yyGLRStackItem*) yystackp->yytops.yystates[yyk];
 +      yyGLRStackItem* yyrhs = (yyGLRStackItem*) yystackp->yytops.yystates[yyk];
        YYASSERT (yyk == 0);
        yystackp->yynextFree -= yynrhs;
        yystackp->yyspaceLeft += yynrhs;
        yystackp->yytops.yystates[0] = & yystackp->yynextFree[-1].yystate;
 -      return yyuserAction (yyrule, yynrhs, rhs, yystackp,
 +      YY_REDUCE_PRINT ((1, yyrhs, yyk, yyrule]b4_user_args[));
 +      return yyuserAction (yyrule, yynrhs, yyrhs, yystackp,
                             yyvalp]b4_locuser_args[);
      }
    else
      {
 -      /* At present, doAction is never called in nondeterministic
 -       * mode, so this branch is never taken.  It is here in
 -       * anticipation of a future feature that will allow immediate
 -       * evaluation of selected actions in nondeterministic mode.  */
        int yyi;
        yyGLRState* yys;
        yyGLRStackItem yyrhsVals[YYMAXRHS + YYMAXLEFT + 1];
          }
        yyupdateSplit (yystackp, yys);
        yystackp->yytops.yystates[yyk] = yys;
 +      YY_REDUCE_PRINT ((0, yyrhsVals + YYMAXRHS + YYMAXLEFT - 1, yyk, yyrule]b4_user_args[));
        return yyuserAction (yyrule, yynrhs, yyrhsVals + YYMAXRHS + YYMAXLEFT - 1,
                             yystackp, yyvalp]b4_locuser_args[);
      }
  }
  
 -#if !]b4_api_PREFIX[DEBUG
 -# define YY_REDUCE_PRINT(Args)
 -#else
 -# define YY_REDUCE_PRINT(Args)          \
 -do {                                    \
 -  if (yydebug)                          \
 -    yy_reduce_print Args;               \
 -} while (YYID (0))
 -
 -/*----------------------------------------------------------.
 -| Report that the RULE is going to be reduced on stack #K.  |
 -`----------------------------------------------------------*/
 -
 -/*ARGSUSED*/ static inline void
 -yy_reduce_print (yyGLRStack* yystackp, size_t yyk, yyRuleNum yyrule,
 -                 YYSTYPE* yyvalp]b4_locuser_formals[)
 -{
 -  int yynrhs = yyrhsLength (yyrule);
 -  yybool yynormal __attribute__ ((__unused__)) =
 -    (yystackp->yysplitPoint == YY_NULL);
 -  yyGLRStackItem* yyvsp = (yyGLRStackItem*) yystackp->yytops.yystates[yyk];
 -  int yylow = 1;
 -  int yyi;
 -  YYUSE (yyvalp);]b4_locations_if([
 -  YYUSE (yylocp);])[
 -]b4_parse_param_use[]dnl
 -[  YYFPRINTF (stderr, "Reducing stack %lu by rule %d (line %lu):\n",
 -             (unsigned long int) yyk, yyrule - 1,
 -             (unsigned long int) yyrline[yyrule]);
 -  /* The symbols being reduced.  */
 -  for (yyi = 0; yyi < yynrhs; yyi++)
 -    {
 -      YYFPRINTF (stderr, "   $%d = ", yyi + 1);
 -      yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
 -                       &]b4_rhs_value(yynrhs, yyi + 1)[
 -                       ]b4_locations_if([, &]b4_rhs_location(yynrhs, yyi + 1))[]dnl
 -                       b4_user_args[);
 -      YYFPRINTF (stderr, "\n");
 -    }
 -}
 -#endif
 -
 -/** Pop items off stack #K of STACK according to grammar rule RULE,
 +/** Pop items off stack #YYK of *YYSTACKP according to grammar rule YYRULE,
   *  and push back on the resulting nonterminal symbol.  Perform the
 - *  semantic action associated with RULE and store its value with the
 - *  newly pushed state, if FORCEEVAL or if STACK is currently
 + *  semantic action associated with YYRULE and store its value with the
 + *  newly pushed state, if YYFORCEEVAL or if *YYSTACKP is currently
   *  unambiguous.  Otherwise, store the deferred semantic action with
   *  the new state.  If the new state would have an identical input
   *  position, LR state, and predecessor to an existing state on the stack,
 - *  it is identified with that existing state, eliminating stack #K from
 - *  the STACK.  In this case, the (necessarily deferred) semantic value is
 + *  it is identified with that existing state, eliminating stack #YYK from
 + *  *YYSTACKP.  In this case, the semantic value is
   *  added to the options for the existing state's semantic value.
   */
  static inline YYRESULTTAG
@@@ -1351,18 -1402,11 +1341,18 @@@ yyglrReduce (yyGLRStack* yystackp, size
  
    if (yyforceEval || yystackp->yysplitPoint == YY_NULL)
      {
 +      YYRESULTTAG yyflag;
        YYSTYPE yysval;]b4_locations_if([
        YYLTYPE yyloc;])[
  
 -      YY_REDUCE_PRINT ((yystackp, yyk, yyrule, &yysval]b4_locuser_args([&yyloc])[));
 -      YYCHK (yydoAction (yystackp, yyk, yyrule, &yysval]b4_locuser_args([&yyloc])[));
 +      yyflag = yydoAction (yystackp, yyk, yyrule, &yysval]b4_locuser_args([&yyloc])[);
 +      if (yyflag == yyerr && yystackp->yysplitPoint != YY_NULL)
 +        {
 +          YYDPRINTF ((stderr, "Parse on stack %lu rejected by rule #%d.\n",
 +                     (unsigned long int) yyk, yyrule - 1));
 +        }
 +      if (yyflag != yyok)
 +        return yyflag;
        YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyrule], &yysval, &yyloc);
        yyglrShift (yystackp, yyk,
                    yyLRgotoState (yystackp->yytops.yystates[yyk]->yylrState,
        yyupdateSplit (yystackp, yys);
        yynewLRState = yyLRgotoState (yys->yylrState, yylhsNonterm (yyrule));
        YYDPRINTF ((stderr,
 -                  "Reduced stack %lu by rule #%d; action deferred.  Now in state %d.\n",
 +                  "Reduced stack %lu by rule #%d; action deferred.  "
 +                  "Now in state %d.\n",
                    (unsigned long int) yyk, yyrule - 1, yynewLRState));
        for (yyi = 0; yyi < yystackp->yytops.yysize; yyi += 1)
          if (yyi != yyk && yystackp->yytops.yystates[yyi] != YY_NULL)
@@@ -1457,7 -1500,7 +1447,7 @@@ yysplitStack (yyGLRStack* yystackp, siz
    return yystackp->yytops.yysize-1;
  }
  
 -/** True iff Y0 and Y1 represent identical options at the top level.
 +/** True iff YYY0 and YYY1 represent identical options at the top level.
   *  That is, they represent the same rule applied to RHS symbols
   *  that produce the same terminal symbols.  */
  static yybool
@@@ -1479,8 -1522,8 +1469,8 @@@ yyidenticalOptions (yySemanticOption* y
      return yyfalse;
  }
  
 -/** Assuming identicalOptions (Y0,Y1), destructively merge the
 - *  alternative semantic values for the RHS-symbols of Y1 and Y0.  */
 +/** Assuming identicalOptions (YYY0,YYY1), destructively merge the
 + *  alternative semantic values for the RHS-symbols of YYY1 and YYY0.  */
  static void
  yymergeOptionSets (yySemanticOption* yyy0, yySemanticOption* yyy1)
  {
          {
            yySemanticOption** yyz0p = &yys0->yysemantics.yyfirstVal;
            yySemanticOption* yyz1 = yys1->yysemantics.yyfirstVal;
 -          while (YYID (yytrue))
 +          while (yytrue)
              {
                if (yyz1 == *yyz0p || yyz1 == YY_NULL)
                  break;
@@@ -1559,11 -1602,11 +1549,11 @@@ static YYRESULTTAG yyresolveValue (yyGL
                                     yyGLRStack* yystackp]b4_user_formals[);
  
  
 -/** Resolve the previous N states starting at and including state S.  If result
 - *  != yyok, some states may have been left unresolved possibly with empty
 - *  semantic option chains.  Regardless of whether result = yyok, each state
 - *  has been left with consistent data so that yydestroyGLRState can be invoked
 - *  if necessary.  */
 +/** Resolve the previous YYN states starting at and including state YYS
 + *  on *YYSTACKP. If result != yyok, some states may have been left
 + *  unresolved possibly with empty semantic option chains.  Regardless
 + *  of whether result = yyok, each state has been left with consistent
 + *  data so that yydestroyGLRState can be invoked if necessary.  */
  static YYRESULTTAG
  yyresolveStates (yyGLRState* yys, int yyn,
                   yyGLRStack* yystackp]b4_user_formals[)
    return yyok;
  }
  
 -/** Resolve the states for the RHS of OPT, perform its user action, and return
 - *  the semantic value and location.  Regardless of whether result = yyok, all
 - *  RHS states have been destroyed (assuming the user action destroys all RHS
 +/** Resolve the states for the RHS of YYOPT on *YYSTACKP, perform its
 + *  user action, and return the semantic value and location in *YYVALP
 + *  and *YYLOCP.  Regardless of whether result = yyok, all RHS states
 + *  have been destroyed (assuming the user action destroys all RHS
   *  semantic values if invoked).  */
  static YYRESULTTAG
  yyresolveAction (yySemanticOption* yyopt, yyGLRStack* yystackp,
@@@ -1655,11 -1697,11 +1645,11 @@@ yyreportTree (yySemanticOption* yyx, in
          {
            if (yystates[yyi-1]->yyposn+1 > yystates[yyi]->yyposn)
              YYFPRINTF (stderr, "%*s%s <empty>\n", yyindent+2, "",
 -                       yytokenName (yyrhs[yyprhs[yyx->yyrule]+yyi-1]));
 +                       yytokenName (yystos[yystates[yyi]->yylrState]));
            else
              YYFPRINTF (stderr, "%*s%s <tokens %lu .. %lu>\n", yyindent+2, "",
 -                       yytokenName (yyrhs[yyprhs[yyx->yyrule]+yyi-1]),
 -                       (unsigned long int) (yystates[yyi - 1]->yyposn + 1),
 +                       yytokenName (yystos[yystates[yyi]->yylrState]),
 +                       (unsigned long int) (yystates[yyi-1]->yyposn + 1),
                         (unsigned long int) yystates[yyi]->yyposn);
          }
        else
  }
  #endif
  
 -/*ARGSUSED*/ static YYRESULTTAG
 +static YYRESULTTAG
  yyreportAmbiguity (yySemanticOption* yyx0,
                     yySemanticOption* yyx1]b4_pure_formals[)
  {
    return yyabort;
  }]b4_locations_if([[
  
 -/** Starting at and including state S1, resolve the location for each of the
 - *  previous N1 states that is unresolved.  The first semantic option of a state
 - *  is always chosen.  */
 +/** Resolve the locations for each of the YYN1 states in *YYSTACKP,
 + *  ending at YYS1.  Has no effect on previously resolved states.
 + *  The first semantic option of a state is always chosen.  */
  static void
  yyresolveLocations (yyGLRState* yys1, int yyn1,
                      yyGLRStack *yystackp]b4_user_formals[)
      }
  }]])[
  
 -/** Resolve the ambiguity represented in state S, perform the indicated
 - *  actions, and set the semantic value of S.  If result != yyok, the chain of
 - *  semantic options in S has been cleared instead or it has been left
 - *  unmodified except that redundant options may have been removed.  Regardless
 - *  of whether result = yyok, S has been left with consistent data so that
 +/** Resolve the ambiguity represented in state YYS in *YYSTACKP,
 + *  perform the indicated actions, and set the semantic value of YYS.
 + *  If result != yyok, the chain of semantic options in YYS has been
 + *  cleared instead or it has been left unmodified except that
 + *  redundant options may have been removed.  Regardless of whether
 + *  result = yyok, YYS has been left with consistent data so that
   *  yydestroyGLRState can be invoked if necessary.  */
  static YYRESULTTAG
  yyresolveValue (yyGLRState* yys, yyGLRStack* yystackp]b4_user_formals[)
@@@ -1887,6 -1928,10 +1877,6 @@@ static YYRESULTTA
  yyprocessOneStack (yyGLRStack* yystackp, size_t yyk,
                     size_t yyposn]b4_pure_formals[)
  {
 -  int yyaction;
 -  const short int* yyconflicts;
 -  yyRuleNum yyrule;
 -
    while (yystackp->yytops.yystates[yyk] != YY_NULL)
      {
        yyStateNum yystate = yystackp->yytops.yystates[yyk]->yylrState;
  
        if (yyisDefaultedState (yystate))
          {
 -          yyrule = yydefaultAction (yystate);
 +          YYRESULTTAG yyflag;
 +          yyRuleNum yyrule = yydefaultAction (yystate);
            if (yyrule == 0)
              {
                YYDPRINTF ((stderr, "Stack %lu dies.\n",
                yymarkStackDeleted (yystackp, yyk);
                return yyok;
              }
 -          YYCHK (yyglrReduce (yystackp, yyk, yyrule, yyfalse]b4_user_args[));
 +          yyflag = yyglrReduce (yystackp, yyk, yyrule, yyimmediate[yyrule]]b4_user_args[);
 +          if (yyflag == yyerr)
 +            {
 +              YYDPRINTF ((stderr,
 +                          "Stack %lu dies "
 +                          "(predicate failure or explicit user error).\n",
 +                          (unsigned long int) yyk));
 +              yymarkStackDeleted (yystackp, yyk);
 +              return yyok;
 +            }
 +          if (yyflag != yyok)
 +            return yyflag;
          }
        else
          {
            yySymbol yytoken;
 +          int yyaction;
 +          const short int* yyconflicts;
 +
            yystackp->yytops.yylookaheadNeeds[yyk] = yytrue;
            if (yychar == YYEMPTY)
              {
  
            while (*yyconflicts != 0)
              {
 +              YYRESULTTAG yyflag;
                size_t yynewStack = yysplitStack (yystackp, yyk);
                YYDPRINTF ((stderr, "Splitting off stack %lu from %lu.\n",
                            (unsigned long int) yynewStack,
                            (unsigned long int) yyk));
 -              YYCHK (yyglrReduce (yystackp, yynewStack,
 -                                  *yyconflicts, yyfalse]b4_user_args[));
 -              YYCHK (yyprocessOneStack (yystackp, yynewStack,
 -                                        yyposn]b4_pure_args[));
 +              yyflag = yyglrReduce (yystackp, yynewStack,
 +                                    *yyconflicts,
 +                                    yyimmediate[*yyconflicts]]b4_user_args[);
 +              if (yyflag == yyok)
 +                YYCHK (yyprocessOneStack (yystackp, yynewStack,
 +                                          yyposn]b4_pure_args[));
 +              else if (yyflag == yyerr)
 +                {
 +                  YYDPRINTF ((stderr, "Stack %lu dies.\n",
 +                              (unsigned long int) yynewStack));
 +                  yymarkStackDeleted (yystackp, yynewStack);
 +                }
 +              else
 +                return yyflag;
                yyconflicts += 1;
              }
  
                break;
              }
            else
 -            YYCHK (yyglrReduce (yystackp, yyk, -yyaction,
 -                                yyfalse]b4_user_args[));
 +            {
 +              YYRESULTTAG yyflag = yyglrReduce (yystackp, yyk, -yyaction,
 +                                                yyimmediate[-yyaction]]b4_user_args[);
 +              if (yyflag == yyerr)
 +                {
 +                  YYDPRINTF ((stderr,
 +                              "Stack %lu dies "
 +                              "(predicate failure or explicit user error).\n",
 +                              (unsigned long int) yyk));
 +                  yymarkStackDeleted (yystackp, yyk);
 +                  break;
 +                }
 +              else if (yyflag != yyok)
 +                return yyflag;
 +            }
          }
      }
    return yyok;
  }
  
 -/*ARGSUSED*/ static void
 +static void
  yyreportSyntaxError (yyGLRStack* yystackp]b4_user_formals[)
  {
    if (yystackp->yyerrState != 0)
  /* Recover from a syntax error on *YYSTACKP, assuming that *YYSTACKP->YYTOKENP,
     yylval, and yylloc are the syntactic category, semantic value, and location
     of the lookahead.  */
 -/*ARGSUSED*/ static void
 +static void
  yyrecoverSyntaxError (yyGLRStack* yystackp]b4_user_formals[)
  {
    size_t yyk;
    if (yystackp->yyerrState == 3)
      /* We just shifted the error token and (perhaps) took some
         reductions.  Skip tokens until we can proceed.  */
 -    while (YYID (yytrue))
 +    while (yytrue)
        {
          yySymbol yytoken;
          if (yychar == YYEOF)
      default:                                                                 \
        goto yybuglab;                                                         \
      }                                                                        \
 -  } while (YYID (0))
 -
 +  } while (0)
  
  /*----------.
  | yyparse.  |
  `----------*/
  
 -]b4_c_ansi_function_def([yyparse], [int], b4_parse_param)[
 +]b4_function_define([yyparse], [int], b4_parse_param)[
  {
    int yyresult;
    yyGLRStack yystack;
    yylloc = yyloc_default;])[
  ]m4_ifdef([b4_initial_action], [
  b4_dollar_pushdef([yylval], [], [yylloc])dnl
 -/* User initialization code.  */
 -b4_user_initial_action
 +  /* User initialization code.  */
 +  b4_user_initial_action
  b4_dollar_popdef])[]dnl
  [
    if (! yyinitGLRStack (yystackp, YYINITDEPTH))
    yyglrShift (&yystack, 0, 0, 0, &yylval]b4_locations_if([, &yylloc])[);
    yyposn = 0;
  
 -  while (YYID (yytrue))
 +  while (yytrue)
      {
        /* For efficiency, we have two loops, the first of which is
           specialized to deterministic operation (single stack, no
           potential ambiguity).  */
        /* Standard mode */
 -      while (YYID (yytrue))
 +      while (yytrue)
          {
            yyRuleNum yyrule;
            int yyaction;
              }
          }
  
 -      while (YYID (yytrue))
 +      while (yytrue)
          {
            yySymbol yytoken_to_shift;
            size_t yys;
        yyfreeGLRStack (&yystack);
      }
  
 -  /* Make sure YYID is used.  */
 -  return YYID (yyresult);
 +  return yyresult;
  }
  
  /* DEBUGGING ONLY */
@@@ -2560,17 -2568,17 +2550,17 @@@ yypdumpstack (yyGLRStack* yystackp
  }
  #endif
  ]b4_epilogue[]dnl
- dnl
- dnl glr.cc produces its own header.
- dnl
+ b4_output_end()
+ # glr.cc produces its own header.
  m4_if(b4_skeleton, ["glr.c"],
  [b4_defines_if(
- [@output(b4_spec_defines_file@)@
+ [b4_output_begin([b4_spec_defines_file])
  b4_copyright([Skeleton interface for Bison GLR parsers in C],
               [2002-2012])[
  
  ]b4_cpp_guard_open([b4_spec_defines_file])[
  ]b4_shared_declarations[
  ]b4_cpp_guard_close([b4_spec_defines_file])[
- ]])])dnl
m4_divert_pop(0)
+ ]b4_output_end()
])])
diff --combined data/glr.cc
index 8841f10be51d31b646c7859cfb1b26289b6afae9,49b4fa1079a5b69b90e34d05d5a14ccf4cebfb3d..3cecfd8eb4ca406f4d44e71b99ce3446f0b9fc17
@@@ -1,3 -1,5 +1,3 @@@
 -                                                                    -*- C -*-
 -
  # C++ GLR skeleton for Bison
  
  # Copyright (C) 2002-2012 Free Software Foundation, Inc.
@@@ -27,7 -29,7 +27,7 @@@
  #
  #   The additional arguments are stored as members of the parser
  #   object, yyparser.  The C routines need to carry yyparser
 -#   throughout the C parser; that easy: just let yyparser become an
 +#   throughout the C parser; that's easy: make yyparser an
  #   additional parse-param.  But because the C++ skeleton needs to
  #   know the "real" original parse-param, we save them
  #   (b4_parse_param_orig).  Note that b4_parse_param is overquoted
  # The locations
  #
  #   We use location.cc just like lalr1.cc, but because glr.c stores
 -#   the locations in a (C++) union, the position and location classes
 +#   the locations in a union, the position and location classes
  #   must not have a constructor.  Therefore, contrary to lalr1.cc, we
  #   must not define "b4_location_constructors".  As a consequence the
  #   user must initialize the first positions (in particular the
  #   filename member).
  
 -# We require a pure interface using locations.
 -m4_define([b4_locations_flag], [1])
 +# We require a pure interface.
  m4_define([b4_pure_flag],      [1])
  
 -# The header is mandatory.
 -b4_defines_if([],
 -              [b4_fatal([b4_skeleton[: using %%defines is mandatory]])])
 -
  m4_include(b4_pkgdatadir/[c++.m4])
 -b4_percent_define_ifdef([[api.location.type]], [],
 -                        [m4_include(b4_pkgdatadir/[location.cc])])
 +b4_locations_if([b4_percent_define_ifdef([[api.location.type]], [],
 +                [m4_include(b4_pkgdatadir/[location.cc])])])
  
  m4_define([b4_parser_class_name],
            [b4_percent_define_get([[parser_class_name]])])
  m4_define([b4_parse_param_orig], m4_defn([b4_parse_param]))
  
  
 -# b4_yy_symbol_print_generate
 -# ---------------------------
 +# b4_yy_symbol_print_define
 +# -------------------------
  # Bypass the default implementation to generate the "yy_symbol_print"
  # and "yy_symbol_value_print" functions.
 -m4_define([b4_yy_symbol_print_generate],
 +m4_define([b4_yy_symbol_print_define],
  [[
  /*--------------------.
  | Print this symbol.  |
  `--------------------*/
  
 -]b4_c_ansi_function_def([yy_symbol_print],
 +]b4_function_define([yy_symbol_print],
      [static void],
 -    [[FILE *],               []],
 -    [[int yytype],           [yytype]],
 +    [[FILE *],      []],
 +    [[int yytype],  [yytype]],
      [[const ]b4_namespace_ref::b4_parser_class_name[::semantic_type *yyvaluep],
 -                             [yyvaluep]],
 +                    [yyvaluep]][]dnl
 +b4_locations_if([,
      [[const ]b4_namespace_ref::b4_parser_class_name[::location_type *yylocationp],
 -                             [yylocationp]],
 +                    [yylocationp]]]),
      b4_parse_param)[
  {
  ]b4_parse_param_use[]dnl
@@@ -95,10 -101,10 +95,10 @@@ m4_defn([b4_initial_action])]))])])
  [b4_syncline([@oline@], [@ofile@])[
  ]b4_yylloc_default_define[
  #define YYRHSLOC(Rhs, K) ((Rhs)[K].yystate.yyloc)
 -]b4_c_ansi_function_decl([yyerror],
 -    [static void],
 +]b4_function_declare([yyerror],
 +    [static void],b4_locations_if([
      [[const ]b4_namespace_ref::b4_parser_class_name[::location_type *yylocationp],
 -                        [yylocationp]],
 +                        [yylocationp]],])
      b4_parse_param,
      [[const char* msg], [msg]])])
  
@@@ -111,26 -117,27 +111,26 @@@ m4_append([b4_epilogue]
  | Report an error.  |
  `------------------*/
  
 -]b4_c_ansi_function_def([yyerror],
 -    [static void],
 +]b4_function_define([yyerror],
 +    [static void],b4_locations_if([
      [[const ]b4_namespace_ref::b4_parser_class_name[::location_type *yylocationp],
 -                        [yylocationp]],
 +                        [yylocationp]],])
      b4_parse_param,
      [[const char* msg], [msg]])[
  {
  ]b4_parse_param_use[]dnl
 -[  yyparser.error (*yylocationp, msg);
 +[  yyparser.error (]b4_locations_if([[*yylocationp, ]])[msg);
  }
  
  
  ]b4_namespace_open[
 -]dnl In this section, the parse param are the original parse_params.
 +]dnl In this section, the parse params are the original parse_params.
  m4_pushdef([b4_parse_param], m4_defn([b4_parse_param_orig]))dnl
  [  /// Build a parser object.
    ]b4_parser_class_name::b4_parser_class_name[ (]b4_parse_param_decl[)]m4_ifset([b4_parse_param], [
      :])[
  #if ]b4_api_PREFIX[DEBUG
 -    ]m4_ifset([b4_parse_param], [  ], [ :])[
 -      yycdebug_ (&std::cerr)]m4_ifset([b4_parse_param], [,])[
 +    ]m4_ifset([b4_parse_param], [  ], [ :])[yycdebug_ (&std::cerr)]m4_ifset([b4_parse_param], [,])[
  #endif]b4_parse_param_cons[
    {
    }
  
    inline void
    ]b4_parser_class_name[::yy_symbol_value_print_ (int yytype,
 -                           const semantic_type* yyvaluep,
 -                           const location_type* yylocationp)
 -  {
 -    YYUSE (yylocationp);
 +                           const semantic_type* yyvaluep]b4_locations_if([[,
 +                           const location_type* yylocationp]])[)
 +  {]b4_locations_if([[
 +    YYUSE (yylocationp);]])[
      YYUSE (yyvaluep);
      std::ostream& yyoutput = debug_stream ();
      std::ostream& yyo = yyoutput;
      YYUSE (yyo);
      switch (yytype)
        {
 -  ]m4_map([b4_symbol_actions], m4_defn([b4_symbol_printers]))dnl
 +]b4_symbol_foreach([b4_symbol_printer])dnl
  [        default:
            break;
        }
  
    void
    ]b4_parser_class_name[::yy_symbol_print_ (int yytype,
 -                           const semantic_type* yyvaluep,
 -                           const location_type* yylocationp)
 +                           const semantic_type* yyvaluep]b4_locations_if([[,
 +                           const location_type* yylocationp]])[)
    {
      *yycdebug_ << (yytype < YYNTOKENS ? "token" : "nterm")
 -               << ' ' << yytname[yytype] << " ("
 -               << *yylocationp << ": ";
 -    yy_symbol_value_print_ (yytype, yyvaluep, yylocationp);
 +               << ' ' << yytname[yytype] << " ("]b4_locations_if([[
 +               << *yylocationp << ": "]])[;
 +    yy_symbol_value_print_ (yytype, yyvaluep]b4_locations_if([[, yylocationp]])[);
      *yycdebug_ << ')';
    }
  
  
  #endif
  ]m4_popdef([b4_parse_param])dnl
 -b4_namespace_close])
 -
 -
 -# Let glr.c believe that the user arguments include the parser itself.
 -m4_ifset([b4_parse_param],
 -[m4_pushdef([b4_parse_param],
 -            [[b4_namespace_ref::b4_parser_class_name[& yyparser], [[yyparser]]],]
 -m4_defn([b4_parse_param]))],
 -[m4_pushdef([b4_parse_param],
 -            [[b4_namespace_ref::b4_parser_class_name[& yyparser], [[yyparser]]]])
 +b4_namespace_close
  ])
 -m4_include(b4_pkgdatadir/[glr.c])
 -m4_popdef([b4_parse_param])
  
 -b4_output_begin([b4_spec_defines_file])
 -b4_copyright([Skeleton interface for Bison GLR parsers in C++],
 -             [2002-2006, 2009-2012])[
 -
 -/* C++ GLR parser skeleton written by Akim Demaille.  */
 -
 -]b4_cpp_guard_open([b4_spec_defines_file])[
 -
 -]b4_percent_code_get([[requires]])[
 +# b4_shared_declarations
 +# ----------------------
 +# Declaration that might either go into the header (if --defines)
 +# or open coded in the parser body.
 +m4_define([b4_shared_declarations],
 +[dnl In this section, the parse params are the original parse_params.
 +m4_pushdef([b4_parse_param], m4_defn([b4_parse_param_orig]))dnl
 +b4_percent_code_get([[requires]])[
  
 -# include <string>
 -# include <iostream>
 -]b4_percent_define_ifdef([[api.location.type]], [],
 -                         [[# include "location.hh"]])[
 +#include <stdexcept>
 +#include <string>
 +#include <iostream>]b4_defines_if([
 +b4_locations_if([b4_percent_define_ifdef([[api.location.type]], [],
 +                                         [[#include "location.hh"]])])])[
  
  ]b4_YYDEBUG_define[
  
  ]b4_namespace_open[
 +]b4_defines_if([],
 +[b4_locations_if([b4_percent_define_ifdef([[api.location.type]], [],
 +                                          [b4_position_define
 +b4_location_define])])])[
 +
    /// A Bison parser.
    class ]b4_parser_class_name[
    {
    public:
 -    /// Symbol semantic values.
 -# ifndef ]b4_api_PREFIX[STYPE
 -]m4_ifdef([b4_stype],
 -[    union semantic_type
 -    {
 -b4_user_stype
 -    };],
 -[m4_if(b4_tag_seen_flag, 0,
 -[[    typedef int semantic_type;]],
 -[[    typedef ]b4_api_PREFIX[STYPE semantic_type;]])])[
 -# else
 -    typedef ]b4_api_PREFIX[STYPE semantic_type;
 -# endif
 -    /// Symbol locations.
 -    typedef ]b4_percent_define_get([[api.location.type]],
 -                                   [[location]])[ location_type;
 -    /// Tokens.
 -    struct token
 -    {
 -      ]b4_token_enums(b4_tokens)[
 -    };
 -    /// Token type.
 -    typedef token::yytokentype token_type;
 +]b4_public_types_declare[
  
      /// Build a parser object.
      ]b4_parser_class_name[ (]b4_parse_param_decl[);
      /// Set the current debugging level.
      void set_debug_level (debug_level_type l);
  
 -  private:
 -
    public:
 -    /// Report a syntax error.
 -    /// \param loc    where the syntax error is found.
 +    /// Report a syntax error.]b4_locations_if([[
 +    /// \param loc    where the syntax error is found.]])[
      /// \param msg    a description of the syntax error.
 -    virtual void error (const location_type& loc, const std::string& msg);
 -  private:
 +    virtual void error (]b4_locations_if([[const location_type& loc, ]])[const std::string& msg);
  
  # if ]b4_api_PREFIX[DEBUG
    public:
      /// \brief Report a symbol value on the debug stream.
      /// \param yytype       The token type.
 -    /// \param yyvaluep     Its semantic value.
 -    /// \param yylocationp  Its location.
 +    /// \param yyvaluep     Its semantic value.]b4_locations_if([[
 +    /// \param yylocationp  Its location.]])[
      virtual void yy_symbol_value_print_ (int yytype,
 -                                         const semantic_type* yyvaluep,
 -                                         const location_type* yylocationp);
 +                                         const semantic_type* yyvaluep]b4_locations_if([[,
 +                                         const location_type* yylocationp]])[);
      /// \brief Report a symbol on the debug stream.
      /// \param yytype       The token type.
 -    /// \param yyvaluep     Its semantic value.
 -    /// \param yylocationp  Its location.
 +    /// \param yyvaluep     Its semantic value.]b4_locations_if([[
 +    /// \param yylocationp  Its location.]])[
      virtual void yy_symbol_print_ (int yytype,
 -                                   const semantic_type* yyvaluep,
 -                                   const location_type* yylocationp);
 +                                   const semantic_type* yyvaluep]b4_locations_if([[,
 +                                   const location_type* yylocationp]])[);
    private:
      /* Debugging.  */
      std::ostream* yycdebug_;
 -# endif
 +#endif
  
  ]b4_parse_param_vars[
    };
  
  ]dnl Redirections for glr.c.
  b4_percent_define_flag_if([[global_tokens_and_yystype]],
 -[b4_token_defines(b4_tokens)])
 +[b4_token_defines])
  [
  #ifndef ]b4_api_PREFIX[STYPE
  # define ]b4_api_PREFIX[STYPE ]b4_namespace_ref[::]b4_parser_class_name[::semantic_type
  
  ]b4_namespace_close[
  ]b4_percent_code_get([[provides]])[
 +]m4_popdef([b4_parse_param])dnl
 +])
 +
 +b4_defines_if(
 +[m4_changecom()dnl
 +m4_divert_push(0)dnl
 +@output(b4_spec_defines_file@)@
 +b4_copyright([Skeleton interface for Bison GLR parsers in C++],
 +             [2002-2012])[
 +
 +/* C++ GLR parser skeleton written by Akim Demaille.  */
 +
 +]b4_cpp_guard_open([b4_spec_defines_file])[
 +]b4_shared_declarations[
  ]b4_cpp_guard_close([b4_spec_defines_file])[
- ]m4_divert_pop(0)
- m4_changecom[#])])
 -]b4_output_end()
++]b4_output_end()])
 +
 +# Let glr.c (and b4_shared_declarations) believe that the user
 +# arguments include the parser itself.
 +m4_ifset([b4_parse_param],
 +[m4_pushdef([b4_parse_param],
 +            [[b4_namespace_ref::b4_parser_class_name[& yyparser], [[yyparser]]],]
 +m4_defn([b4_parse_param]))],
 +[m4_pushdef([b4_parse_param],
 +            [[b4_namespace_ref::b4_parser_class_name[& yyparser], [[yyparser]]]])
 +])
 +m4_include(b4_pkgdatadir/[glr.c])
 +m4_popdef([b4_parse_param])
diff --combined data/lalr1.cc
index 34eef13801a661d2db596f4d0da6612f7521d1fd,237b246f5be6490e7393028c86f425d1b57fc4c5..fa3a48d484af0e623b108a4ba504786c2d6e4ff9
  
  m4_include(b4_pkgdatadir/[c++.m4])
  
 -m4_define([b4_parser_class_name],
 -          [b4_percent_define_get([[parser_class_name]])])
  
 -# The header is mandatory.
 -b4_defines_if([],
 -              [b4_fatal([b4_skeleton[: using %%defines is mandatory]])])
 +# b4_integral_parser_table_declare(TABLE-NAME, CONTENT, COMMENT)
 +# --------------------------------------------------------------
 +# Declare "parser::yy<TABLE-NAME>_" which contents is CONTENT.
 +m4_define([b4_integral_parser_table_declare],
 +[m4_ifval([$3], [b4_comment([$3], [  ])
 +])dnl
 +  static const b4_int_type_for([$2]) yy$1_[[]];dnl
 +])
  
 -b4_percent_define_ifdef([[api.location.type]], [],
 -  [# Backward compatibility.
 -  m4_define([b4_location_constructors])
 -  m4_include(b4_pkgdatadir/[location.cc])])
 -m4_include(b4_pkgdatadir/[stack.hh])
 +# b4_integral_parser_table_define(TABLE-NAME, CONTENT, COMMENT)
 +# -------------------------------------------------------------
 +# Define "parser::yy<TABLE-NAME>_" which contents is CONTENT.
 +m4_define([b4_integral_parser_table_define],
 +[  const b4_int_type_for([$2])
 +  b4_parser_class_name::yy$1_[[]] =
 +  {
 +  $2
 +  };dnl
 +])
  
 -b4_defines_if(
 -[b4_output_begin([b4_spec_defines_file])
 -b4_copyright([Skeleton interface for Bison LALR(1) parsers in C++],
 -             [2002-2012])
 -[
 -/**
 - ** \file ]b4_spec_defines_file[
 - ** Define the ]b4_namespace_ref[::parser class.
 - */
  
 -/* C++ LALR(1) parser skeleton written by Akim Demaille.  */
 +# b4_symbol_value_template(VAL, [TYPE])
 +# -------------------------------------
 +# Same as b4_symbol_value, but used in a template method.  It makes
 +# a difference when using variants.
 +m4_copy([b4_symbol_value], [b4_symbol_value_template])
 +
 +
 +# b4_lhs_value([TYPE])
 +# --------------------
 +# Expansion of $<TYPE>$.
 +m4_define([b4_lhs_value],
 +          [b4_symbol_value([yylhs.value], [$1])])
 +
 +
 +# b4_lhs_location()
 +# -----------------
 +# Expansion of @$.
 +m4_define([b4_lhs_location],
 +          [yylhs.location])
 +
 +
 +# b4_rhs_data(RULE-LENGTH, NUM)
 +# -----------------------------
 +# Return the data corresponding to the symbol #NUM, where the current
 +# rule has RULE-LENGTH symbols on RHS.
 +m4_define([b4_rhs_data],
 +          [yystack_@{b4_subtract($@)@}])
 +
 +
 +# b4_rhs_state(RULE-LENGTH, NUM)
 +# ------------------------------
 +# The state corresponding to the symbol #NUM, where the current
 +# rule has RULE-LENGTH symbols on RHS.
 +m4_define([b4_rhs_state],
 +          [b4_rhs_data([$1], [$2]).state])
 +
 +
 +# b4_rhs_value(RULE-LENGTH, NUM, [TYPE])
 +# --------------------------------------
 +# Expansion of $<TYPE>NUM, where the current rule has RULE-LENGTH
 +# symbols on RHS.
 +m4_define([b4_rhs_value],
 +          [b4_symbol_value([b4_rhs_data([$1], [$2]).value], [$3])])
 +
 +
 +# b4_rhs_location(RULE-LENGTH, NUM)
 +# ---------------------------------
 +# Expansion of @NUM, where the current rule has RULE-LENGTH symbols
 +# on RHS.
 +m4_define([b4_rhs_location],
 +          [b4_rhs_data([$1], [$2]).location])
 +
 +
 +# 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_symbol_value], m4_defn([b4_symbol_value_template]))[]dnl
 +b4_dollar_pushdef([yysym.value],
 +                   b4_symbol_if([$1], [has_type],
 +                                [m4_dquote(b4_symbol([$1], [type]))]),
 +                   [yysym.location])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_symbol_value])[]dnl
 +b4_dollar_popdef[]dnl
 +])])
  
 -]b4_cpp_guard_open([b4_spec_defines_file])[
  
 -]b4_percent_code_get([[requires]])[
 +m4_pushdef([b4_copyright_years],
 +           [2002-2012])
  
 -#include <string>
 -#include <iostream>
 -#include "stack.hh"
 -]b4_percent_define_ifdef([[api.location.type]], [],
 -                         [[#include "location.hh"]])[
 +m4_define([b4_parser_class_name],
 +          [b4_percent_define_get([[parser_class_name]])])
 +
 +b4_locations_if([b4_percent_define_ifdef([[api.location.type]], [],
 +  [# Backward compatibility.
 +   m4_define([b4_location_constructors])
 +   m4_include(b4_pkgdatadir/[location.cc])])])
 +m4_include(b4_pkgdatadir/[stack.hh])
 +b4_variant_if([m4_include(b4_pkgdatadir/[variant.hh])])
 +
 +# b4_shared_declarations
 +# ----------------------
 +# Declaration that might either go into the header (if --defines)
 +# or open coded in the parser body.
 +m4_define([b4_shared_declarations],
 +[b4_percent_code_get([[requires]])[
 +]b4_parse_assert_if([# include <cassert>])[
 +# include <deque>
 +# include <iostream>
 +# include <stdexcept>
 +# include <string>]b4_defines_if([[
 +# include "stack.hh"
 +]b4_locations_if([b4_percent_define_ifdef([[api.location.type]], [],
 +                                          [[# include "location.hh"]])])])[
  
  ]b4_YYDEBUG_define[
  
  ]b4_namespace_open[
  
 +]b4_defines_if([],
 +[b4_stack_define
 +b4_locations_if([b4_percent_define_ifdef([[api.location.type]], [],
 +                                         [b4_position_define
 +b4_location_define])])])[
 +
 +]b4_variant_if([b4_variant_define])[
 +
    /// A Bison parser.
    class ]b4_parser_class_name[
    {
    public:
 -    /// Symbol semantic values.
 -#ifndef ]b4_api_PREFIX[STYPE
 -]m4_ifdef([b4_stype],
 -[    union semantic_type
 -    {
 -b4_user_stype
 -    };],
 -[m4_if(b4_tag_seen_flag, 0,
 -[[    typedef int semantic_type;]],
 -[[    typedef ]b4_api_PREFIX[STYPE semantic_type;]])])[
 -#else
 -    typedef ]b4_api_PREFIX[STYPE semantic_type;
 -#endif
 -    /// Symbol locations.
 -    typedef ]b4_percent_define_get([[api.location.type]],
 -                                   [[location]])[ location_type;
 -    /// Tokens.
 -    struct token
 -    {
 -      ]b4_token_enums(b4_tokens)[
 -    };
 -    /// Token type.
 -    typedef token::yytokentype token_type;
 -
 +]b4_public_types_declare[
      /// Build a parser object.
      ]b4_parser_class_name[ (]b4_parse_param_decl[);
      virtual ~]b4_parser_class_name[ ();
      void set_debug_level (debug_level_type l);
  #endif
  
 -  private:
 -    /// Report a syntax error.
 -    /// \param loc    where the syntax error is found.
 +    /// Report a syntax error.]b4_locations_if([[
 +    /// \param loc    where the syntax error is found.]])[
      /// \param msg    a description of the syntax error.
 -    virtual void error (const location_type& loc, const std::string& msg);
 -
 -    /// Generate an error message.
 -    /// \param state   the state where the error occurred.
 -    /// \param tok     the lookahead token.
 -    virtual std::string yysyntax_error_ (int yystate, int tok);
 -
 -#if ]b4_api_PREFIX[DEBUG
 -    /// \brief Report a symbol value on the debug stream.
 -    /// \param yytype       The token type.
 -    /// \param yyvaluep     Its semantic value.
 -    /// \param yylocationp  Its location.
 -    virtual void yy_symbol_value_print_ (int yytype,
 -                                       const semantic_type* yyvaluep,
 -                                       const location_type* yylocationp);
 -    /// \brief Report a symbol on the debug stream.
 -    /// \param yytype       The token type.
 -    /// \param yyvaluep     Its semantic value.
 -    /// \param yylocationp  Its location.
 -    virtual void yy_symbol_print_ (int yytype,
 -                                 const semantic_type* yyvaluep,
 -                                 const location_type* yylocationp);
 -#endif
 +    virtual void error (]b4_locations_if([[const location_type& loc, ]])[const std::string& msg);
  
 +    /// Report a syntax error.
 +    void error (const syntax_error& err);
  
 +  private:
      /// State numbers.
      typedef int state_type;
 -    /// State stack type.
 -    typedef stack<state_type>    state_stack_type;
 -    /// Semantic value stack type.
 -    typedef stack<semantic_type> semantic_stack_type;
 -    /// location stack type.
 -    typedef stack<location_type> location_stack_type;
 -
 -    /// The state stack.
 -    state_stack_type yystate_stack_;
 -    /// The semantic value stack.
 -    semantic_stack_type yysemantic_stack_;
 -    /// The location stack.
 -    location_stack_type yylocation_stack_;
 +
 +    /// Generate an error message.
 +    /// \param yystate   the state where the error occurred.
 +    /// \param yytoken   the lookahead token.
 +    virtual std::string yysyntax_error_ (state_type yystate, int yytoken);
 +
 +    /// Compute post-reduction state.
 +    /// \param yystate   the current state
 +    /// \param yylhs     the nonterminal to push on the stack
 +    state_type yy_lr_goto_state_ (state_type yystate, int yylhs);
  
      /// Whether the given \c yypact_ value indicates a defaulted state.
      /// \param yyvalue   the value to check
  
      /// Internal symbol numbers.
      typedef ]b4_int_type_for([b4_translate])[ token_number_type;
 -    /* Tables.  */
 -    /// For a state, the index in \a yytable_ of its portion.
 -    static const ]b4_int_type_for([b4_pact])[ yypact_[];
      static const ]b4_int_type(b4_pact_ninf, b4_pact_ninf)[ yypact_ninf_;
 -
 -    /// For a state, default reduction number.
 -    /// Unless\a  yytable_ specifies something else to do.
 -    /// Zero means the default is an error.
 -    static const ]b4_int_type_for([b4_defact])[ yydefact_[];
 -
 -    static const ]b4_int_type_for([b4_pgoto])[ yypgoto_[];
 -    static const ]b4_int_type_for([b4_defgoto])[ yydefgoto_[];
 -
 -    /// What to do in a state.
 -    /// \a yytable_[yypact_[s]]: what to do in state \a s.
 -    /// - if positive, shift that token.
 -    /// - if negative, reduce the rule which number is the opposite.
 -    /// - if zero, do what YYDEFACT says.
 -    static const ]b4_int_type_for([b4_table])[ yytable_[];
      static const ]b4_int_type(b4_table_ninf, b4_table_ninf)[ yytable_ninf_;
  
 -    static const ]b4_int_type_for([b4_check])[ yycheck_[];
 -
 -    /// For a state, its accessing symbol.
 -    static const ]b4_int_type_for([b4_stos])[ yystos_[];
 -
 -    /// For a rule, its LHS.
 -    static const ]b4_int_type_for([b4_r1])[ yyr1_[];
 -    /// For a rule, its RHS length.
 -    static const ]b4_int_type_for([b4_r2])[ yyr2_[]; ]b4_error_verbose_if([
 +    // Tables.
 +]b4_parser_tables_declare[]b4_error_verbose_if([
  
      /// Convert the symbol name \a n to a form suitable for a diagnostic.
      static std::string yytnamerr_ (const char *n);])[
      /// For a symbol, its name in clear.
      static const char* const yytname_[];
  ]b4_token_table_if([[#if ]b4_api_PREFIX[DEBUG]])[
 -    /// A type to store symbol numbers and -1.
 -    typedef ]b4_int_type_for([b4_rhs])[ rhs_number_type;
 -    /// A `-1'-separated list of the rules' RHS.
 -    static const rhs_number_type yyrhs_[];
 -    /// For each rule, the index of the first RHS symbol in \a yyrhs_.
 -    static const ]b4_int_type_for([b4_prhs])[ yyprhs_[];
 -    /// For each rule, its source line number.
 -    static const ]b4_int_type_for([b4_rline])[ yyrline_[];
 -    /// For each scanner token number, its symbol number.
 -    static const ]b4_int_type_for([b4_toknum])[ yytoken_number_[];
 +]b4_integral_parser_table_declare([rline], [b4_rline],
 +     [YYRLINE[YYN] -- Source line where rule number YYN was defined.])[
      /// Report on the debug stream that the rule \a r is going to be reduced.
      virtual void yy_reduce_print_ (int r);
      /// Print the state stack on the debug stream.
      virtual void yystack_print_ ();
  
 -    /* Debugging.  */
 +    // Debugging.
      int yydebug_;
      std::ostream* yycdebug_;
 -#endif
 +#endif // ]b4_api_PREFIX[DEBUG
  
      /// Convert a scanner token number \a t to a symbol number.
 -    token_number_type yytranslate_ (int t);
 +    static inline token_number_type yytranslate_ (]b4_token_ctor_if([token_type], [int])[ t);
 +
 +#if ]b4_api_PREFIX[DEBUG
 +    /// \brief Display a symbol type, value and location.
 +    /// \param yyo    The output stream.
 +    /// \param yysym  The symbol.
 +    template <typename Exact>
 +    void yy_print_ (std::ostream& yyo,
 +                    const symbol_base_type<Exact>& yysym) const;
 +#endif
  
      /// \brief Reclaim the memory associated to a symbol.
 -    /// \param yymsg        Why this token is reclaimed.
 -    ///                     If null, do not display the symbol, just free it.
 -    /// \param yytype       The symbol type.
 -    /// \param yyvaluep     Its semantic value.
 -    /// \param yylocationp  Its location.
 -    inline void yydestruct_ (const char* yymsg,
 -                           int yytype,
 -                           semantic_type* yyvaluep,
 -                           location_type* yylocationp);
 +    /// \param yymsg     Why this token is reclaimed.
 +    ///                  If null, print nothing.
 +    /// \param s         The symbol.
 +    template <typename Exact>
 +    inline void yy_destroy_ (const char* yymsg,
 +                             symbol_base_type<Exact>& yysym) const;
 +
 +  private:
 +    /// Element of the stack: a state and its attributes.
 +    struct stack_symbol_type : symbol_base_type<stack_symbol_type>
 +    {
 +      /// The parent class.
 +      typedef symbol_base_type<stack_symbol_type> super_type;
 +
 +      /// Default constructor.
 +      inline stack_symbol_type ();
 +
 +      /// Constructor.
 +      inline stack_symbol_type (]b4_join([state_type s],
 +                                         [const semantic_type& v],
 +                                         b4_locations_if([const location_type& l]))[);
 +
 +      /// The state.
 +      state_type state;
 +
 +      /// The type (corresponding to \a state).
 +      inline int type_get_ () const;
 +    };
 +
 +    /// Stack type.
 +    typedef stack<stack_symbol_type> stack_type;
 +
 +    /// The stack.
 +    stack_type yystack_;
 +
 +    /// Push a new state on the stack.
 +    /// \param m    a debug message to display
 +    ///             if null, no trace is output.
 +    /// \param s    the symbol
 +    /// \warning the contents of \a s.value is stolen.
 +    inline void yypush_ (const char* m, stack_symbol_type& s);
 +
 +    /// Push a new look ahead token on the state on the stack.
 +    /// \param m    a debug message to display
 +    ///             if null, no trace is output.
 +    /// \param s    the state
 +    /// \param sym  the symbol (for its value and location).
 +    /// \warning the contents of \a s.value is stolen.
 +    inline void yypush_ (const char* m, state_type s, symbol_type& sym);
  
      /// Pop \a n symbols the three stacks.
      inline void yypop_ (unsigned int n = 1);
  
      /* Constants.  */
 -    static const int yyeof_;
 -    /* LAST_ -- Last index in TABLE_.  */
 -    static const int yylast_;
 -    static const int yynnts_;
 -    static const int yyempty_;
 -    static const int yyfinal_;
 -    static const int yyterror_;
 -    static const int yyerrcode_;
 -    static const int yyntokens_;
 -    static const unsigned int yyuser_token_number_max_;
 -    static const token_number_type yyundef_token_;
 +    enum
 +    {
 +      yyeof_ = 0,
 +      yylast_ = ]b4_last[,           //< Last index in yytable_.
 +      yynnts_ = ]b4_nterms_number[,  //< Number of nonterminal symbols.
 +      yyempty_ = -2,
 +      yyfinal_ = ]b4_final_state_number[, //< Termination state number.
 +      yyterror_ = 1,
 +      yyerrcode_ = 256,
 +      yyntokens_ = ]b4_tokens_number[    //< Number of tokens.
 +    };
 +
  ]b4_parse_param_vars[
    };
 +
 +]b4_token_ctor_if([b4_yytranslate_define
 +b4_public_types_define])[
  ]b4_namespace_close[
  
  ]b4_percent_define_flag_if([[global_tokens_and_yystype]],
 -[b4_token_defines(b4_tokens)
 +[b4_token_defines
  
  #ifndef ]b4_api_PREFIX[STYPE
   /* Redirection for backward compatibility.  */
  #endif
  ])[
  ]b4_percent_code_get([[provides]])[
 +]])
 +
 +# We do want M4 expansion after # for CPP macros.
 +m4_changecom()
 +b4_defines_if(
 +[m4_divert_push(0)dnl
 +@output(b4_spec_defines_file@)@
 +b4_copyright([Skeleton interface for Bison LALR(1) parsers in C++])
 +[
 +/**
 + ** \file ]b4_spec_defines_file[
 + ** Define the ]b4_namespace_ref[::parser class.
 + */
 +
 +/* C++ LALR(1) parser skeleton written by Akim Demaille.  */
 +
 +]b4_cpp_guard_open([b4_spec_defines_file])[
 +]b4_shared_declarations[
  ]b4_cpp_guard_close([b4_spec_defines_file])
- m4_divert_pop(0)dnl
+ b4_output_end()
  ])
  
  
- m4_divert_push(0)dnl
- @output(b4_parser_file_name@)@
+ b4_output_begin([b4_parser_file_name])
 -b4_copyright([Skeleton implementation for Bison LALR(1) parsers in C++],
 -             [2002-2012])
 +b4_copyright([Skeleton implementation for Bison LALR(1) parsers in C++])
  b4_percent_code_get([[top]])[]dnl
  m4_if(b4_prefix, [yy], [],
  [
  // Take the name prefix into account.
  #define yylex   b4_prefix[]lex])[
  
 -/* First part of user declarations.  */
 +// First part of user declarations.
  ]b4_user_pre_prologue[
  
 -]b4_defines_if([[
 -#include "@basename(]b4_spec_defines_file[@)"]])[
 +]b4_null_define[
 +
 +]b4_defines_if([[#include "@basename(]b4_spec_defines_file[@)"]],
 +               [b4_shared_declarations])[
  
  /* User implementation prologue.  */
  ]b4_user_post_prologue[
  ]b4_percent_code_get[
  
 -]b4_null_define[
 -
  #ifndef YY_
  # if defined YYENABLE_NLS && YYENABLE_NLS
  #  if ENABLE_NLS
  # endif
  #endif
  
 -#define YYRHSLOC(Rhs, K) ((Rhs)[K])
 -]b4_yylloc_default_define[
 +]b4_locations_if([dnl
 +[#define YYRHSLOC(Rhs, K) ((Rhs)[K].location)
 +]b4_yylloc_default_define])[
  
  /* Suppress unused-variable warnings by "using" E.  */
  #define YYUSE(e) ((void) (e))
  /* A pseudo ostream that takes yydebug_ into account.  */
  # define YYCDEBUG if (yydebug_) (*yycdebug_)
  
 -# define YY_SYMBOL_PRINT(Title, Type, Value, Location)        \
 -do {                                                  \
 -  if (yydebug_)                                               \
 -    {                                                 \
 -      *yycdebug_ << Title << ' ';                     \
 -      yy_symbol_print_ ((Type), (Value), (Location)); \
 -      *yycdebug_ << std::endl;                                \
 -    }                                                 \
 -} while (false)
 -
 -# define YY_REDUCE_PRINT(Rule)                \
 -do {                                  \
 -  if (yydebug_)                               \
 -    yy_reduce_print_ (Rule);          \
 -} while (false)
 -
 -# define YY_STACK_PRINT()             \
 -do {                                  \
 -  if (yydebug_)                               \
 -    yystack_print_ ();                        \
 -} while (false)
 +# define YY_SYMBOL_PRINT(Title, Symbol)         \
 +  do {                                          \
 +    if (yydebug_)                               \
 +    {                                           \
 +      *yycdebug_ << Title << ' ';               \
 +      yy_print_ (*yycdebug_, Symbol);           \
 +      *yycdebug_ << std::endl;                  \
 +    }                                           \
 +  } while (false)
 +
 +# define YY_REDUCE_PRINT(Rule)          \
 +  do {                                  \
 +    if (yydebug_)                       \
 +      yy_reduce_print_ (Rule);          \
 +  } while (false)
 +
 +# define YY_STACK_PRINT()               \
 +  do {                                  \
 +    if (yydebug_)                       \
 +      yystack_print_ ();                \
 +  } while (false)
  
  #else /* !]b4_api_PREFIX[DEBUG */
  
  # define YYCDEBUG if (false) std::cerr
 -# define YY_SYMBOL_PRINT(Title, Type, Value, Location) YYUSE(Type)
 -# define YY_REDUCE_PRINT(Rule)        static_cast<void>(0)
 -# define YY_STACK_PRINT()             static_cast<void>(0)
 +# define YY_SYMBOL_PRINT(Title, Symbol)  YYUSE(Symbol)
 +# define YY_REDUCE_PRINT(Rule)           static_cast<void>(0)
 +# define YY_STACK_PRINT()                static_cast<void>(0)
  
  #endif /* !]b4_api_PREFIX[DEBUG */
  
 -#define yyerrok               (yyerrstatus_ = 0)
 -#define yyclearin     (yychar = yyempty_)
 +#define yyerrok         (yyerrstatus_ = 0)
 +#define yyclearin       (yyempty = true)
  
 -#define YYACCEPT      goto yyacceptlab
 -#define YYABORT               goto yyabortlab
 -#define YYERROR               goto yyerrorlab
 +#define YYACCEPT        goto yyacceptlab
 +#define YYABORT         goto yyabortlab
 +#define YYERROR         goto yyerrorlab
  #define YYRECOVERING()  (!!yyerrstatus_)
  
  ]b4_namespace_open[]b4_error_verbose_if([[
    {
    }
  
 -#if ]b4_api_PREFIX[DEBUG
 -  /*--------------------------------.
 -  | Print this symbol on YYOUTPUT.  |
 -  `--------------------------------*/
  
 -  inline void
 -  ]b4_parser_class_name[::yy_symbol_value_print_ (int yytype,
 -                         const semantic_type* yyvaluep, const location_type* yylocationp)
 +  /*---------------.
 +  | Symbol types.  |
 +  `---------------*/
 +
 +]b4_token_ctor_if([], [b4_public_types_define])[
 +
 +  // stack_symbol_type.
 +  ]b4_parser_class_name[::stack_symbol_type::stack_symbol_type ()
 +    : super_type ()
 +    , state ()
 +  {
 +  }
 +
 +  ]b4_parser_class_name[::stack_symbol_type::stack_symbol_type (]b4_join(
 +                 [state_type s],
 +                 [const semantic_type& v],
 +                 b4_locations_if([const location_type& l]))[)
 +    : super_type (v]b4_locations_if([, l])[)
 +    , state (s)
 +  {
 +  }
 +
 +  int
 +  ]b4_parser_class_name[::stack_symbol_type::type_get_ () const
 +  {
 +    return yystos_[state];
 +  }
 +
 +
 +  template <typename Exact>
 +  void
 +  ]b4_parser_class_name[::yy_destroy_ (const char* yymsg,
 +                                       symbol_base_type<Exact>& yysym) const
 +  {
 +    if (yymsg)
 +      YY_SYMBOL_PRINT (yymsg, yysym);
 +
 +    // User destructor.
 +    int yytype = yysym.type_get ();
 +    switch (yytype)
 +      {
 +]b4_symbol_foreach([b4_symbol_destructor])dnl
 +[       default:
 +          break;
 +      }]b4_variant_if([
 +
 +    // Type destructor.
 +  b4_symbol_variant([[yytype]], [[yysym.value]], [[template destroy]])])[
 +  }
 +
 +#if ]b4_api_PREFIX[DEBUG
 +  template <typename Exact>
 +  void
 +  ]b4_parser_class_name[::yy_print_ (std::ostream& yyo,
 +                                     const symbol_base_type<Exact>& yysym) const
    {
 -    YYUSE (yylocationp);
 -    YYUSE (yyvaluep);
 -    std::ostream& yyo = debug_stream ();
      std::ostream& yyoutput = yyo;
      YYUSE (yyoutput);
 +    int yytype = yysym.type_get ();
 +    yyo << (yytype < yyntokens_ ? "token" : "nterm")
 +        << ' ' << yytname_[yytype] << " ("]b4_locations_if([
 +        << yysym.location << ": "])[;
      switch (yytype)
        {
 -  ]m4_map([b4_symbol_actions], m4_defn([b4_symbol_printers]))dnl
 +]b4_symbol_foreach([b4_symbol_printer])dnl
  [       default:
 -        break;
 +          break;
        }
 +    yyo << ')';
    }
 -
 +#endif
  
    void
 -  ]b4_parser_class_name[::yy_symbol_print_ (int yytype,
 -                         const semantic_type* yyvaluep, const location_type* yylocationp)
 +  ]b4_parser_class_name[::yypush_ (const char* m, state_type s,
 +                                   symbol_type& sym)
    {
 -    *yycdebug_ << (yytype < yyntokens_ ? "token" : "nterm")
 -             << ' ' << yytname_[yytype] << " ("
 -             << *yylocationp << ": ";
 -    yy_symbol_value_print_ (yytype, yyvaluep, yylocationp);
 -    *yycdebug_ << ')';
 +    if (m)
 +      YY_SYMBOL_PRINT (m, sym);
 +]b4_variant_if(
 +[[    yystack_.push (stack_symbol_type (]b4_join(
 +                    [s],
 +                    [semantic_type()],
 +                    b4_locations_if([sym.location]))[));
 +    ]b4_symbol_variant([[yystos_[s]]], [[yystack_[0].value]],
 +                       [build], [sym.value])],
 +[[    yystack_.push (stack_symbol_type (]b4_join(
 +                      [s],
 +                      [sym.value],
 +                      b4_locations_if([sym.location]))[));]])[
    }
 -#endif
  
    void
 -  ]b4_parser_class_name[::yydestruct_ (const char* yymsg,
 -                         int yytype, semantic_type* yyvaluep, location_type* yylocationp)
 +  ]b4_parser_class_name[::yypush_ (const char* m, stack_symbol_type& s)
    {
 -    YYUSE (yylocationp);
 -    YYUSE (yymsg);
 -    YYUSE (yyvaluep);
 -
 -    if (yymsg)
 -      YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
 -
 -    switch (yytype)
 -      {
 -  ]m4_map([b4_symbol_actions], m4_defn([b4_symbol_destructors]))[
 -      default:
 -        break;
 -      }
 +    if (m)
 +      YY_SYMBOL_PRINT (m, s);
 +]b4_variant_if(
 +[[    yystack_.push (stack_symbol_type (]b4_join(
 +                       [s.state],
 +                       [semantic_type()],
 +                       b4_locations_if([s.location]))[));
 +    ]b4_symbol_variant([[yystos_[s.state]]], [[yystack_[0].value]],
 +                       [build], [s.value])],
 +[    yystack_.push (s);])[
    }
  
    void
    ]b4_parser_class_name[::yypop_ (unsigned int n)
    {
 -    yystate_stack_.pop (n);
 -    yysemantic_stack_.pop (n);
 -    yylocation_stack_.pop (n);
 +    yystack_.pop (n);
    }
  
  #if ]b4_api_PREFIX[DEBUG
    {
      yydebug_ = l;
    }
 -#endif
 +#endif // ]b4_api_PREFIX[DEBUG
 +
 +  inline ]b4_parser_class_name[::state_type
 +  ]b4_parser_class_name[::yy_lr_goto_state_ (state_type yystate, int yylhs)
 +  {
 +    int yyr = yypgoto_[yylhs - yyntokens_] + yystate;
 +    if (0 <= yyr && yyr <= yylast_ && yycheck_[yyr] == yystate)
 +      return yytable_[yyr];
 +    else
 +      return yydefgoto_[yylhs - yyntokens_];
 +  }
  
    inline bool
    ]b4_parser_class_name[::yy_pact_value_is_default_ (int yyvalue)
    int
    ]b4_parser_class_name[::parse ()
    {
 -    /// Lookahead and lookahead in internal form.
 -    int yychar = yyempty_;
 -    int yytoken = 0;
 +    /// Whether yyla contains a lookahead.
 +    bool yyempty = true;
  
      // State.
      int yyn;
      int yylen = 0;
 -    int yystate = 0;
  
      // Error handling.
      int yynerrs_ = 0;
      int yyerrstatus_ = 0;
  
 -    /// Semantic value of the lookahead.
 -    static semantic_type yyval_default;
 -    semantic_type yylval = yyval_default;
 -    /// Location of the lookahead.
 -    location_type yylloc;
 +    /// The lookahead symbol.
 +    symbol_type yyla;]b4_locations_if([[
 +
      /// The locations where the error started and ended.
 -    location_type yyerror_range[3];
 +    stack_symbol_type yyerror_range[3];]])[
  
 -    /// $$.
 -    semantic_type yyval;
 -    /// @@$.
 -    location_type yyloc;
 +    /// $$ and @@$.
 +    stack_symbol_type yylhs;
  
 +    /// The return value of parse ().
      int yyresult;
  
      // FIXME: This shoud be completely indented.  It is not yet to
      YYCDEBUG << "Starting parse" << std::endl;
  
  ]m4_ifdef([b4_initial_action], [
 -b4_dollar_pushdef([yylval], [], [yylloc])dnl
 -/* User initialization code.  */
 -b4_user_initial_action
 +b4_dollar_pushdef([yyla.value], [], [yyla.location])dnl
 +    /* User initialization code.  */
 +    b4_user_initial_action
  b4_dollar_popdef])[]dnl
  
 -  [  /* Initialize the stacks.  The initial state will be pushed in
 +  [  /* Initialize the stack.  The initial state will be set in
         yynewstate, since the latter expects the semantical and the
         location values to have been already stored, initialize these
         stacks with a primary value.  */
 -    yystate_stack_ = state_stack_type (0);
 -    yysemantic_stack_ = semantic_stack_type (0);
 -    yylocation_stack_ = location_stack_type (0);
 -    yysemantic_stack_.push (yylval);
 -    yylocation_stack_.push (yylloc);
 +    yystack_ = stack_type (0);
 +    yypush_ (YY_NULL, 0, yyla);
  
 -    /* New state.  */
 +    // A new symbol was pushed on the stack.
    yynewstate:
 -    yystate_stack_.push (yystate);
 -    YYCDEBUG << "Entering state " << yystate << std::endl;
 +    YYCDEBUG << "Entering state " << yystack_[0].state << std::endl;
  
      /* Accept?  */
 -    if (yystate == yyfinal_)
 +    if (yystack_[0].state == yyfinal_)
        goto yyacceptlab;
  
      goto yybackup;
    yybackup:
  
      /* Try to take a decision without lookahead.  */
 -    yyn = yypact_[yystate];
 +    yyn = yypact_[yystack_[0].state];
      if (yy_pact_value_is_default_ (yyn))
        goto yydefault;
  
      /* Read a lookahead token.  */
 -    if (yychar == yyempty_)
 +    if (yyempty)
        {
          YYCDEBUG << "Reading a token: ";
 -        yychar = ]b4_c_function_call([yylex], [int],
 -                                     [b4_api_PREFIX[STYPE*], [&yylval]][]dnl
 -b4_locations_if([, [[location*], [&yylloc]]])dnl
 -m4_ifdef([b4_lex_param], [, ]b4_lex_param))[;
 -      }
 -
 -    /* Convert token to internal form.  */
 -    if (yychar <= yyeof_)
 -      {
 -      yychar = yytoken = yyeof_;
 -      YYCDEBUG << "Now at end of input." << std::endl;
 -      }
 -    else
 -      {
 -      yytoken = yytranslate_ (yychar);
 -      YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
 +        try
 +          {
 +]b4_token_ctor_if(
 +[            yyla = b4_function_call([yylex], [symbol_type],
 +                                     m4_ifdef([b4_lex_param], b4_lex_param));],
 +[            yyla.type = yytranslate_ (b4_function_call([yylex], [int],
 +                                     [b4_api_PREFIX[STYPE*], [&yyla.value]][]dnl
 +b4_locations_if([, [[location*], [&yyla.location]]])dnl
 +m4_ifdef([b4_lex_param], [, ]b4_lex_param)));])[
 +          }
 +        catch (const syntax_error& yyexc)
 +          {
 +            error (yyexc);
 +            goto yyerrlab1;
 +          }
 +        yyempty = false;
        }
 +    YY_SYMBOL_PRINT ("Next token is", yyla);
  
 -    /* If the proper action on seeing token YYTOKEN is to reduce or to
 -       detect an error, take that action.  */
 -    yyn += yytoken;
 -    if (yyn < 0 || yylast_ < yyn || yycheck_[yyn] != yytoken)
 +    /* If the proper action on seeing token YYLA.TYPE is to reduce or
 +       to detect an error, take that action.  */
 +    yyn += yyla.type;
 +    if (yyn < 0 || yylast_ < yyn || yycheck_[yyn] != yyla.type)
        goto yydefault;
  
      /* Reduce or error.  */
      yyn = yytable_[yyn];
      if (yyn <= 0)
        {
 -      if (yy_table_value_is_error_ (yyn))
 -        goto yyerrlab;
 -      yyn = -yyn;
 -      goto yyreduce;
 +        if (yy_table_value_is_error_ (yyn))
 +          goto yyerrlab;
 +        yyn = -yyn;
 +        goto yyreduce;
        }
  
 -    /* Shift the lookahead token.  */
 -    YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
 -
      /* Discard the token being shifted.  */
 -    yychar = yyempty_;
 -
 -    yysemantic_stack_.push (yylval);
 -    yylocation_stack_.push (yylloc);
 +    yyempty = true;
  
      /* Count tokens shifted since error; after three, turn off error
         status.  */
      if (yyerrstatus_)
        --yyerrstatus_;
  
 -    yystate = yyn;
 +    /* Shift the lookahead token.  */
 +    yypush_ ("Shifting", yyn, yyla);
      goto yynewstate;
  
    /*-----------------------------------------------------------.
    | yydefault -- do the default action for the current state.  |
    `-----------------------------------------------------------*/
    yydefault:
 -    yyn = yydefact_[yystate];
 +    yyn = yydefact_[yystack_[0].state];
      if (yyn == 0)
        goto yyerrlab;
      goto yyreduce;
    `-----------------------------*/
    yyreduce:
      yylen = yyr2_[yyn];
 +    yylhs.state = yy_lr_goto_state_(yystack_[yylen].state, yyr1_[yyn]);]b4_variant_if([
 +    /* Variants are always initialized to an empty instance of the
 +       correct type. The default $$=$1 action is NOT applied when using
 +       variants.  */
 +    b4_symbol_variant([[yyr1_@{yyn@}]], [yylhs.value], [build])],[
      /* If YYLEN is nonzero, implement the default value of the action:
         `$$ = $1'.  Otherwise, use the top of the stack.
  
 -       Otherwise, the following line sets YYVAL to garbage.
 +       Otherwise, the following line sets YYLHS.VALUE to garbage.
         This behavior is undocumented and Bison
         users should not rely upon it.  */
      if (yylen)
 -      yyval = yysemantic_stack_[yylen - 1];
 +      yylhs.value = yystack_@{yylen - 1@}.value;
      else
 -      yyval = yysemantic_stack_[0];
 -
 +      yylhs.value = yystack_@{0@}.value;])[
 +]b4_locations_if([dnl
 +[
      // Compute the default @@$.
      {
 -      slice<location_type, location_stack_type> slice (yylocation_stack_, yylen);
 -      YYLLOC_DEFAULT (yyloc, slice, yylen);
 -    }
 +      slice<stack_symbol_type, stack_type> slice (yystack_, yylen);
 +      YYLLOC_DEFAULT (yylhs.location, slice, yylen);
 +    }]])[
  
      // Perform the reduction.
      YY_REDUCE_PRINT (yyn);
 -    switch (yyn)
 +    try
        {
 -        ]b4_user_actions[
 -      default:
 -        break;
 +        switch (yyn)
 +          {
 +]b4_user_actions[
 +          default:
 +            break;
 +          }
        }
 -
 -    /* User semantic actions sometimes alter yychar, and that requires
 -       that yytoken be updated with the new translation.  We take the
 -       approach of translating immediately before every use of yytoken.
 -       One alternative is translating here after every semantic action,
 -       but that translation would be missed if the semantic action
 -       invokes YYABORT, YYACCEPT, or YYERROR immediately after altering
 -       yychar.  In the case of YYABORT or YYACCEPT, an incorrect
 -       destructor might then be invoked immediately.  In the case of
 -       YYERROR, subsequent parser actions might lead to an incorrect
 -       destructor call or verbose syntax error message before the
 -       lookahead is translated.  */
 -    YY_SYMBOL_PRINT ("-> $$ =", yyr1_[yyn], &yyval, &yyloc);
 +    catch (const syntax_error& yyexc)
 +      {
 +        error (yyexc);
 +        YYERROR;
 +      }
 +    YY_SYMBOL_PRINT ("-> $$ =", yylhs);
 +]b4_variant_if([[
 +    // Destroy the rhs symbols.
 +    for (int i = 0; i < yylen; ++i)
 +      // Destroy a variant which value may have been swapped with
 +      // yylhs.value (for instance if the action was "std::swap($$,
 +      // $1)").  The value of yylhs.value (hence possibly one of these
 +      // rhs symbols) depends on the default construction for this
 +      // type.  In the case of pointers for instance, no
 +      // initialization is done, so the value is junk.  Therefore do
 +      // not try to report the value of symbols about to be destroyed
 +      // in the debug trace, it's possibly junk.  Hence yymsg = 0.
 +      // Besides, that keeps exactly the same traces as with the other
 +      // Bison skeletons.
 +      yy_destroy_ (YY_NULL, yystack_[i]);]])[
  
      yypop_ (yylen);
      yylen = 0;
      YY_STACK_PRINT ();
  
 -    yysemantic_stack_.push (yyval);
 -    yylocation_stack_.push (yyloc);
 -
      /* Shift the result of the reduction.  */
 -    yyn = yyr1_[yyn];
 -    yystate = yypgoto_[yyn - yyntokens_] + yystate_stack_[0];
 -    if (0 <= yystate && yystate <= yylast_
 -      && yycheck_[yystate] == yystate_stack_[0])
 -      yystate = yytable_[yystate];
 -    else
 -      yystate = yydefgoto_[yyn - yyntokens_];
 +    yypush_ (YY_NULL, yylhs);
      goto yynewstate;
  
 -  /*------------------------------------.
 -  | yyerrlab -- here on detecting error |
 -  `------------------------------------*/
 +  /*--------------------------------------.
 +  | yyerrlab -- here on detecting error |
 +  `--------------------------------------*/
    yyerrlab:
 -    /* Make sure we have latest lookahead translation.  See comments at
 -       user semantic actions for why this is necessary.  */
 -    yytoken = yytranslate_ (yychar);
 -
      /* If not already recovering from an error, report this error.  */
      if (!yyerrstatus_)
        {
 -      ++yynerrs_;
 -      if (yychar == yyempty_)
 -        yytoken = yyempty_;
 -      error (yylloc, yysyntax_error_ (yystate, yytoken));
 +        ++yynerrs_;
 +        error (]b4_join(b4_locations_if([yyla.location]),
 +                        [[yysyntax_error_ (yystack_[0].state,
 +                                           yyempty ? yyempty_ : yyla.type)]])[);
        }
  
 -    yyerror_range[1] = yylloc;
 +]b4_locations_if([[
 +    yyerror_range[1].location = yyla.location;]])[
      if (yyerrstatus_ == 3)
        {
          /* If just tried and failed to reuse lookahead token after an
             error, discard it.  */
 -        if (yychar <= yyeof_)
 -          {
 -            /* Return failure if at end of input.  */
 -            if (yychar == yyeof_)
 -              YYABORT;
 -          }
 -        else
 +
 +        /* Return failure if at end of input.  */
 +        if (yyla.type == yyeof_)
 +          YYABORT;
 +        else if (!yyempty)
            {
 -            yydestruct_ ("Error: discarding", yytoken, &yylval, &yylloc);
 -            yychar = yyempty_;
 +            yy_destroy_ ("Error: discarding", yyla);
 +            yyempty = true;
            }
        }
  
         YYERROR and the label yyerrorlab therefore never appears in user
         code.  */
      if (false)
 -      goto yyerrorlab;
 -
 -    yyerror_range[1] = yylocation_stack_[yylen - 1];
 +      goto yyerrorlab;]b4_locations_if([[
 +    yyerror_range[1].location = yystack_[yylen - 1].location;]])b4_variant_if([[
 +    /* $$ was initialized before running the user action.  */
 +    yy_destroy_ ("Error: discarding", yylhs);]])[
      /* Do not reclaim the symbols of the rule which action triggered
         this YYERROR.  */
      yypop_ (yylen);
      yylen = 0;
 -    yystate = yystate_stack_[0];
      goto yyerrlab1;
  
    /*-------------------------------------------------------------.
    | yyerrlab1 -- common code for both syntax error and YYERROR.  |
    `-------------------------------------------------------------*/
    yyerrlab1:
 -    yyerrstatus_ = 3; /* Each real token shifted decrements this.  */
 -
 -    for (;;)
 -      {
 -      yyn = yypact_[yystate];
 -      if (!yy_pact_value_is_default_ (yyn))
 -      {
 -        yyn += yyterror_;
 -        if (0 <= yyn && yyn <= yylast_ && yycheck_[yyn] == yyterror_)
 -          {
 -            yyn = yytable_[yyn];
 -            if (0 < yyn)
 -              break;
 -          }
 -      }
 -
 -      /* Pop the current state because it cannot handle the error token.  */
 -      if (yystate_stack_.height () == 1)
 -        YYABORT;
 -
 -      yyerror_range[1] = yylocation_stack_[0];
 -      yydestruct_ ("Error: popping",
 -                   yystos_[yystate],
 -                   &yysemantic_stack_[0], &yylocation_stack_[0]);
 -      yypop_ ();
 -      yystate = yystate_stack_[0];
 -      YY_STACK_PRINT ();
 -      }
 -
 -    yyerror_range[2] = yylloc;
 -    // Using YYLLOC is tempting, but would change the location of
 -    // the lookahead.  YYLOC is available though.
 -    YYLLOC_DEFAULT (yyloc, yyerror_range, 2);
 -    yysemantic_stack_.push (yylval);
 -    yylocation_stack_.push (yyloc);
 +    yyerrstatus_ = 3;   /* Each real token shifted decrements this.  */
 +    {
 +      stack_symbol_type error_token;
 +      for (;;)
 +        {
 +          yyn = yypact_[yystack_[0].state];
 +          if (!yy_pact_value_is_default_ (yyn))
 +            {
 +              yyn += yyterror_;
 +              if (0 <= yyn && yyn <= yylast_ && yycheck_[yyn] == yyterror_)
 +                {
 +                  yyn = yytable_[yyn];
 +                  if (0 < yyn)
 +                    break;
 +                }
 +            }
  
 -    /* Shift the error token.  */
 -    YY_SYMBOL_PRINT ("Shifting", yystos_[yyn],
 -                   &yysemantic_stack_[0], &yylocation_stack_[0]);
 +          // Pop the current state because it cannot handle the error token.
 +          if (yystack_.size () == 1)
 +            YYABORT;
 +]b4_locations_if([[
 +          yyerror_range[1].location = yystack_[0].location;]])[
 +          yy_destroy_ ("Error: popping", yystack_[0]);
 +          yypop_ ();
 +          YY_STACK_PRINT ();
 +        }
 +]b4_locations_if([[
 +      yyerror_range[2].location = yyla.location;
 +      YYLLOC_DEFAULT (error_token.location, yyerror_range, 2);]])[
  
 -    yystate = yyn;
 +      /* Shift the error token.  */
 +      error_token.state = yyn;
 +      yypush_ ("Shifting", error_token);
 +    }
      goto yynewstate;
  
      /* Accept.  */
      goto yyreturn;
  
    yyreturn:
 -    if (yychar != yyempty_)
 -      {
 -        /* Make sure we have latest lookahead translation.  See comments
 -           at user semantic actions for why this is necessary.  */
 -        yytoken = yytranslate_ (yychar);
 -        yydestruct_ ("Cleanup: discarding lookahead", yytoken, &yylval,
 -                     &yylloc);
 -      }
 +    if (!yyempty)
 +      yy_destroy_ ("Cleanup: discarding lookahead", yyla);
  
      /* Do not reclaim the symbols of the rule which action triggered
         this YYABORT or YYACCEPT.  */
      yypop_ (yylen);
 -    while (1 < yystate_stack_.height ())
 +    while (1 < yystack_.size ())
        {
 -        yydestruct_ ("Cleanup: popping",
 -                     yystos_[yystate_stack_[0]],
 -                     &yysemantic_stack_[0],
 -                     &yylocation_stack_[0]);
 +        yy_destroy_ ("Cleanup: popping", yystack_[0]);
          yypop_ ();
        }
  
      return yyresult;
 -    }
 +  }
      catch (...)
        {
          YYCDEBUG << "Exception caught: cleaning lookahead and stack"
                   << std::endl;
          // Do not try to display the values of the reclaimed symbols,
          // as their printer might throw an exception.
 -        if (yychar != yyempty_)
 -          {
 -            /* Make sure we have latest lookahead translation.  See
 -               comments at user semantic actions for why this is
 -               necessary.  */
 -            yytoken = yytranslate_ (yychar);
 -            yydestruct_ (YY_NULL, yytoken, &yylval, &yylloc);
 -          }
 +        if (!yyempty)
 +          yy_destroy_ (YY_NULL, yyla);
  
 -        while (1 < yystate_stack_.height ())
 +        while (1 < yystack_.size ())
            {
 -            yydestruct_ (YY_NULL,
 -                         yystos_[yystate_stack_[0]],
 -                         &yysemantic_stack_[0],
 -                         &yylocation_stack_[0]);
 +            yy_destroy_ (YY_NULL, yystack_[0]);
              yypop_ ();
            }
          throw;
        }
    }
  
 +  void
 +  ]b4_parser_class_name[::error (const syntax_error& yyexc)
 +  {
 +    error (]b4_join(b4_locations_if([yyexc.location]),
 +                    [[yyexc.what()]])[);
 +  }
 +
    // Generate an error message.
    std::string
    ]b4_parser_class_name[::yysyntax_error_ (]dnl
 -b4_error_verbose_if([int yystate, int yytoken],
 +b4_error_verbose_if([state_type yystate, int yytoken],
                      [int, int])[)
    {]b4_error_verbose_if([[
      std::string yyres;
           a consistent state with a default action.  There might have
           been a previous inconsistent state, consistent state with a
           non-default action, or user semantic action that manipulated
 -         yychar.
 +         yyla.  (However, yyla is currently not documented for users.)
         - Of course, the expected token list depends on states to have
           correct lookahead information, and it depends on the parser not
           to perform extra reductions after fetching a lookahead from the
    }
  
  
 -  /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
 -     STATE-NUM.  */
    const ]b4_int_type(b4_pact_ninf, b4_pact_ninf) b4_parser_class_name::yypact_ninf_ = b4_pact_ninf[;
 -  const ]b4_int_type_for([b4_pact])[
 -  ]b4_parser_class_name[::yypact_[] =
 -  {
 -    ]b4_pact[
 -  };
 -
 -  /* YYDEFACT[S] -- default reduction number in state S.  Performed when
 -     YYTABLE doesn't specify something else to do.  Zero means the
 -     default is an error.  */
 -  const ]b4_int_type_for([b4_defact])[
 -  ]b4_parser_class_name[::yydefact_[] =
 -  {
 -    ]b4_defact[
 -  };
  
 -  /* YYPGOTO[NTERM-NUM].  */
 -  const ]b4_int_type_for([b4_pgoto])[
 -  ]b4_parser_class_name[::yypgoto_[] =
 -  {
 -    ]b4_pgoto[
 -  };
 -
 -  /* YYDEFGOTO[NTERM-NUM].  */
 -  const ]b4_int_type_for([b4_defgoto])[
 -  ]b4_parser_class_name[::yydefgoto_[] =
 -  {
 -    ]b4_defgoto[
 -  };
 -
 -  /* 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.  */
    const ]b4_int_type(b4_table_ninf, b4_table_ninf) b4_parser_class_name::yytable_ninf_ = b4_table_ninf[;
 -  const ]b4_int_type_for([b4_table])[
 -  ]b4_parser_class_name[::yytable_[] =
 -  {
 -    ]b4_table[
 -  };
 -
 -  /* YYCHECK.  */
 -  const ]b4_int_type_for([b4_check])[
 -  ]b4_parser_class_name[::yycheck_[] =
 -  {
 -    ]b4_check[
 -  };
 -
 -  /* STOS_[STATE-NUM] -- The (internal number of the) accessing
 -     symbol of state STATE-NUM.  */
 -  const ]b4_int_type_for([b4_stos])[
 -  ]b4_parser_class_name[::yystos_[] =
 -  {
 -    ]b4_stos[
 -  };
  
 -#if ]b4_api_PREFIX[DEBUG
 -  /* TOKEN_NUMBER_[YYLEX-NUM] -- Internal symbol number corresponding
 -     to YYLEX-NUM.  */
 -  const ]b4_int_type_for([b4_toknum])[
 -  ]b4_parser_class_name[::yytoken_number_[] =
 -  {
 -    ]b4_toknum[
 -  };
 -#endif
 -
 -  /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
 -  const ]b4_int_type_for([b4_r1])[
 -  ]b4_parser_class_name[::yyr1_[] =
 -  {
 -    ]b4_r1[
 -  };
 -
 -  /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
 -  const ]b4_int_type_for([b4_r2])[
 -  ]b4_parser_class_name[::yyr2_[] =
 -  {
 -    ]b4_r2[
 -  };
 +]b4_parser_tables_define[
  
  ]b4_token_table_if([], [[#if ]b4_api_PREFIX[DEBUG]])[
    /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
    const char*
    const ]b4_parser_class_name[::yytname_[] =
    {
 -    ]b4_tname[
 +  ]b4_tname[
    };
  
  ]b4_token_table_if([[#if ]b4_api_PREFIX[DEBUG]])[
 -  /* YYRHS -- A `-1'-separated list of the rules' RHS.  */
 -  const ]b4_parser_class_name[::rhs_number_type
 -  ]b4_parser_class_name[::yyrhs_[] =
 -  {
 -    ]b4_rhs[
 -  };
 -
 -  /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
 -     YYRHS.  */
 -  const ]b4_int_type_for([b4_prhs])[
 -  ]b4_parser_class_name[::yyprhs_[] =
 -  {
 -    ]b4_prhs[
 -  };
 -
 -  /* YYRLINE[YYN] -- Source line where rule number YYN was defined.  */
 -  const ]b4_int_type_for([b4_rline])[
 -  ]b4_parser_class_name[::yyrline_[] =
 -  {
 -    ]b4_rline[
 -  };
 +]b4_integral_parser_table_define([rline], [b4_rline])[
  
    // Print the state stack on the debug stream.
    void
    ]b4_parser_class_name[::yystack_print_ ()
    {
      *yycdebug_ << "Stack now";
 -    for (state_stack_type::const_iterator i = yystate_stack_.begin ();
 -       i != yystate_stack_.end (); ++i)
 -      *yycdebug_ << ' ' << *i;
 +    for (stack_type::const_iterator
 +           i = yystack_.begin (),
 +           i_end = yystack_.end ();
 +         i != i_end; ++i)
 +      *yycdebug_ << ' ' << i->state;
      *yycdebug_ << std::endl;
    }
  
      int yynrhs = yyr2_[yyrule];
      /* Print the symbols being reduced, and their result.  */
      *yycdebug_ << "Reducing stack by rule " << yyrule - 1
 -             << " (line " << yylno << "):" << std::endl;
 +               << " (line " << yylno << "):" << std::endl;
      /* The symbols being reduced.  */
      for (int yyi = 0; yyi < yynrhs; yyi++)
        YY_SYMBOL_PRINT ("   $" << yyi + 1 << " =",
 -                     yyrhs_[yyprhs_[yyrule] + yyi],
 -                     &]b4_rhs_value(yynrhs, yyi + 1)[,
 -                     &]b4_rhs_location(yynrhs, yyi + 1)[);
 +                       ]b4_rhs_data(yynrhs, yyi + 1)[);
    }
  #endif // ]b4_api_PREFIX[DEBUG
  
 -  /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
 -  ]b4_parser_class_name[::token_number_type
 -  ]b4_parser_class_name[::yytranslate_ (int t)
 -  {
 -    static
 -    const token_number_type
 -    translate_table[] =
 -    {
 -      ]b4_translate[
 -    };
 -    if ((unsigned int) t <= yyuser_token_number_max_)
 -      return translate_table[t];
 -    else
 -      return yyundef_token_;
 -  }
 -
 -  const int ]b4_parser_class_name[::yyeof_ = 0;
 -  const int ]b4_parser_class_name[::yylast_ = ]b4_last[;
 -  const int ]b4_parser_class_name[::yynnts_ = ]b4_nterms_number[;
 -  const int ]b4_parser_class_name[::yyempty_ = -2;
 -  const int ]b4_parser_class_name[::yyfinal_ = ]b4_final_state_number[;
 -  const int ]b4_parser_class_name[::yyterror_ = 1;
 -  const int ]b4_parser_class_name[::yyerrcode_ = 256;
 -  const int ]b4_parser_class_name[::yyntokens_ = ]b4_tokens_number[;
 -
 -  const unsigned int ]b4_parser_class_name[::yyuser_token_number_max_ = ]b4_user_token_number_max[;
 -  const ]b4_parser_class_name[::token_number_type ]b4_parser_class_name[::yyundef_token_ = ]b4_undef_token_number[;
 -
 +]b4_token_ctor_if([], [b4_yytranslate_define])[
  ]b4_namespace_close[
  ]b4_epilogue[]dnl
- m4_divert_pop(0)
+ b4_output_end()
++
++
 +m4_popdef([b4_copyright_years])dnl
diff --combined data/lalr1.java
index 1cfaef38caf15686beb2d9731ae46215d5af92b5,e961fc5b450f56a1d3a3ac31eede13b713b8205c..02079fd0a2f63efb1578f3bd2081fd6edc9fff71
  
  m4_include(b4_pkgdatadir/[java.m4])
  
 -b4_defines_if([b4_fatal([%s: %%defines does not make sense in Java], [b4_skeleton])])
 -m4_ifval(m4_defn([b4_symbol_destructors]),
 -        [b4_fatal([%s: %%destructor does not make sense in Java], [b4_skeleton])],
 -        [])
 +b4_defines_if([b4_fatal([%s: %%defines does not make sense in Java],
 +              [b4_skeleton])])
 +
 +# We don't depend on %debug in Java, but pacify warnings about non-used flags.
 +b4_parse_trace_if([0], [0])
 +
 +m4_define([b4_symbol_no_destructor_assert],
 +[b4_symbol_if([$1], [has_destructor],
 +              [b4_fatal([%s: %s: %%destructor does not make sense in Java],
 +                        [b4_skeleton],
 +                        [b4_symbol_action_location([$1], [destructor])])])])
 +b4_symbol_foreach([b4_symbol_no_destructor_assert])
  
- m4_divert_push(0)dnl
- @output(b4_parser_file_name@)@
+ b4_output_begin([b4_parser_file_name])
  b4_copyright([Skeleton implementation for Bison LALR(1) parsers in Java],
               [2007-2012])
  
  b4_percent_define_ifdef([package], [package b4_percent_define_get([package]);
  ])[/* First part of user declarations.  */
 -]b4_pre_prologue
 +]b4_user_pre_prologue
 +b4_user_post_prologue
  b4_percent_code_get([[imports]])
  [/**
   * A Bison parser, automatically generated from <tt>]m4_bpatsubst(b4_file_name, [^"\(.*\)"$], [\1])[</tt>.
   *
   * @@author LALR (1) parser skeleton written by Paolo Bonzini.
   */
 -]b4_public_if([public ])dnl
 +]b4_percent_define_get3([annotations], [], [ ])dnl
 +b4_public_if([public ])dnl
  b4_abstract_if([abstract ])dnl
  b4_final_if([final ])dnl
  b4_strictfp_if([strictfp ])dnl
@@@ -55,22 -44,9 +54,22 @@@ b4_percent_define_get3([extends], [ ext
  b4_percent_define_get3([implements], [ implements ])[
  {
    ]b4_identification[
 -
 +]b4_error_verbose_if([[
    /** True if verbose error messages are enabled.  */
 -  public boolean errorVerbose = ]b4_flag_value([error_verbose]);
 +  private boolean yyErrorVerbose = true;
 +
 +  /**
 +   * Return whether verbose error messages are enabled.
 +   */
 +  public final boolean getErrorVerbose() { return yyErrorVerbose; }
 +
 +  /**
 +   * Set the verbosity of error messages.
 +   * @@param verbose True to request verbose error messages.
 +   */
 +  public final void setErrorVerbose(boolean verbose)
 +  { yyErrorVerbose = verbose; }
 +]])
  
  b4_locations_if([[
    /**
  
  ]])
  
 -[  /** Token returned by the scanner to signal the end of its input.  */
 -  public static final int EOF = 0;]
 -
 -b4_token_enums(b4_tokens)
 -
    b4_locations_if([[
    private ]b4_location_type[ yylloc (YYStack rhs, int n)
    {
     * parser <tt>]b4_parser_class_name[</tt>.
     */
    public interface Lexer {
 +    /** Token returned by the scanner to signal the end of its input.  */
 +    public static final int EOF = 0;
 +
 +]b4_token_enums[
 +
      ]b4_locations_if([[/**
       * Method to retrieve the beginning position of the last scanned token.
       * @@return the position at which the last scanned token starts.  */
       *
       * ]b4_locations_if([[@@param loc The location of the element to which the
       *                error message is related]])[
 -     * @@param s The string for the error message.  */
 -     void yyerror (]b4_locations_if([b4_location_type[ loc, ]])[String s);]
 +     * @@param msg The string for the error message.  */
 +     void yyerror (]b4_locations_if([b4_location_type[ loc, ]])[String msg);]
    }
  
    b4_lexer_if([[private class YYLexer implements Lexer {
@@@ -180,9 -156,7 +179,9 @@@ b4_lexer_if([
    /**
     * Instantiates the Bison-generated parser.
     */
 -  public ]b4_parser_class_name (b4_parse_param_decl([b4_lex_param_decl])[) {
 +  public ]b4_parser_class_name (b4_parse_param_decl([b4_lex_param_decl])[) ]b4_maybe_throws([b4_init_throws])[
 +  {
 +    ]b4_percent_code_get([[init]])[
      this.yylexer = new YYLexer(]b4_lex_param_call[);
      ]b4_parse_param_cons[
    }
     * Instantiates the Bison-generated parser.
     * @@param yylexer The scanner that will supply tokens to the parser.
     */
 -  b4_lexer_if([[protected]], [[public]]) b4_parser_class_name[ (]b4_parse_param_decl([[Lexer yylexer]])[) {
 +  b4_lexer_if([[protected]], [[public]]) b4_parser_class_name[ (]b4_parse_param_decl([[Lexer yylexer]])[) ]b4_maybe_throws([b4_init_throws])[
 +  {
 +    ]b4_percent_code_get([[init]])[
      this.yylexer = yylexer;
      ]b4_parse_param_cons[
    }
     */
    public final void setDebugLevel(int level) { yydebug = level; }
  
 -  private final int yylex () ]b4_maybe_throws([b4_lex_throws]) [{
 -    return yylexer.yylex ();
 +  /**
 +   * Print an error message via the lexer.
 +   *]b4_locations_if([[ Use a <code>null</code> location.]])[
 +   * @@param msg The error message.
 +   */
 +  public final void yyerror (String msg)
 +  {
 +    yylexer.yyerror (]b4_locations_if([[(]b4_location_type[)null, ]])[msg);
    }
 -  protected final void yyerror (]b4_locations_if([b4_location_type[ loc, ]])[String s) {
 -    yylexer.yyerror (]b4_locations_if([loc, ])[s);
 +]b4_locations_if([[
 +  /**
 +   * Print an error message via the lexer.
 +   * @@param loc The location associated with the message.
 +   * @@param msg The error message.
 +   */
 +  public final void yyerror (]b4_location_type[ loc, String msg)
 +  {
 +    yylexer.yyerror (loc, msg);
    }
  
 -  ]b4_locations_if([
 -  protected final void yyerror (String s) {
 -    yylexer.yyerror ((]b4_location_type[)null, s);
 -  }
 -  protected final void yyerror (]b4_position_type[ loc, String s) {
 -    yylexer.yyerror (new ]b4_location_type[ (loc), s);
 -  }])
 +  /**
 +   * Print an error message via the lexer.
 +   * @@param pos The position associated with the message.
 +   * @@param msg The error message.
 +   */
 +  public final void yyerror (]b4_position_type[ pos, String msg)
 +  {
 +    yylexer.yyerror (new ]b4_location_type[ (pos), msg);
 +  }]])
  
    [protected final void yycdebug (String s) {
      if (yydebug > 0)
      public int height = -1;
  
      public final void push (int state, ]b4_yystype[ value]dnl
 -                          b4_locations_if([, ]b4_location_type[ loc])[) {
 +                            b4_locations_if([, ]b4_location_type[ loc])[) {
        height++;
        if (size == height)
          {
 -        int[] newStateStack = new int[size * 2];
 -        System.arraycopy (stateStack, 0, newStateStack, 0, height);
 -        stateStack = newStateStack;
 -        ]b4_locations_if([[
 -        ]b4_location_type[[] newLocStack = new ]b4_location_type[[size * 2];
 -        System.arraycopy (locStack, 0, newLocStack, 0, height);
 -        locStack = newLocStack;]])
 -
 -        b4_yystype[[] newValueStack = new ]b4_yystype[[size * 2];
 -        System.arraycopy (valueStack, 0, newValueStack, 0, height);
 -        valueStack = newValueStack;
 -
 -        size *= 2;
 -      }
 +          int[] newStateStack = new int[size * 2];
 +          System.arraycopy (stateStack, 0, newStateStack, 0, height);
 +          stateStack = newStateStack;
 +          ]b4_locations_if([[
 +          ]b4_location_type[[] newLocStack = new ]b4_location_type[[size * 2];
 +          System.arraycopy (locStack, 0, newLocStack, 0, height);
 +          locStack = newLocStack;]])
 +
 +          b4_yystype[[] newValueStack = new ]b4_yystype[[size * 2];
 +          System.arraycopy (valueStack, 0, newValueStack, 0, height);
 +          valueStack = newValueStack;
 +
 +          size *= 2;
 +        }
  
        stateStack[height] = state;
        ]b4_locations_if([[locStack[height] = loc;]])[
      public final void pop (int num) {
        // Avoid memory leaks... garbage collection is a white lie!
        if (num > 0) {
 -      java.util.Arrays.fill (valueStack, height - num + 1, height + 1, null);
 +        java.util.Arrays.fill (valueStack, height - num + 1, height + 1, null);
          ]b4_locations_if([[java.util.Arrays.fill (locStack, height - num + 1, height + 1, null);]])[
        }
        height -= num;
  
        for (int i = 0; i <= height; i++)
          {
 -        out.print (' ');
 -        out.print (stateStack[i]);
 +          out.print (' ');
 +          out.print (stateStack[i]);
          }
        out.println ();
      }
  
      switch (yyn)
        {
 -      ]b4_user_actions[
 -      default: break;
 +        ]b4_user_actions[
 +        default: break;
        }
  
      yy_symbol_print ("-> $$ =", yyr1_[yyn], yyval]b4_locations_if([, yyloc])[);
      yyn = yyr1_[yyn];
      int yystate = yypgoto_[yyn - yyntokens_] + yystack.stateAt (0);
      if (0 <= yystate && yystate <= yylast_
 -      && yycheck_[yystate] == yystack.stateAt (0))
 +        && yycheck_[yystate] == yystack.stateAt (0))
        yystate = yytable_[yystate];
      else
        yystate = yydefgoto_[yyn - yyntokens_];
      return YYNEWSTATE;
    }
  
 +]b4_error_verbose_if([[
    /* Return YYSTR after stripping away unnecessary quotes and
       backslashes, so that it's suitable for yyerror.  The heuristic is
       that double-quoting is unnecessary unless the string contains an
                break strip_quotes;
  
              case '\\':
 -            if (yystr.charAt(++i) != '\\')
 +              if (yystr.charAt(++i) != '\\')
                  break strip_quotes;
                /* Fall through.  */
              default:
  
      return yystr;
    }
 +]])[
  
    /*--------------------------------.
    | Print this symbol on YYOUTPUT.  |
    `--------------------------------*/
  
    private void yy_symbol_print (String s, int yytype,
 -                               ]b4_yystype[ yyvaluep]dnl
 -                               b4_locations_if([, Object yylocationp])[)
 +                                 ]b4_yystype[ yyvaluep]dnl
 +                                 b4_locations_if([, Object yylocationp])[)
    {
      if (yydebug > 0)
      yycdebug (s + (yytype < yyntokens_ ? " token " : " nterm ")
 -            + yytname_[yytype] + " ("]b4_locations_if([
 -            + yylocationp + ": "])[
 -            + (yyvaluep == null ? "(null)" : yyvaluep.toString ()) + ")");
 +              + yytname_[yytype] + " ("]b4_locations_if([
 +              + yylocationp + ": "])[
 +              + (yyvaluep == null ? "(null)" : yyvaluep.toString ()) + ")");
    }
  
    /**
  
  ]m4_ifdef([b4_initial_action], [
  b4_dollar_pushdef([yylval], [], [yylloc])dnl
 -/* User initialization code.  */
 -b4_user_initial_action
 +    /* User initialization code.  */
 +    b4_user_initial_action
  b4_dollar_popdef])[]dnl
  
    [  /* Initialize the stack.  */
        switch (label)
        {
          /* New state.  Unlike in the C/C++ skeletons, the state is already
 -         pushed when we come here.  */
 +           pushed when we come here.  */
        case YYNEWSTATE:
          yycdebug ("Entering state " + yystate + "\n");
          if (yydebug > 0)
          if (yy_pact_value_is_default_ (yyn))
            {
              label = YYDEFAULT;
 -          break;
 +            break;
            }
  
          /* Read a lookahead token.  */
          if (yychar == yyempty_)
            {
 -          yycdebug ("Reading a token: ");
 -          yychar = yylex ();]
 +            yycdebug ("Reading a token: ");
 +            yychar = yylexer.yylex ();]
              b4_locations_if([[
 -          yylloc = new ]b4_location_type[(yylexer.getStartPos (),
 -                                          yylexer.getEndPos ());]])
 +            yylloc = new ]b4_location_type[(yylexer.getStartPos (),
 +                            yylexer.getEndPos ());]])
              yylval = yylexer.getLVal ();[
            }
  
          /* Convert token to internal form.  */
 -        if (yychar <= EOF)
 +        if (yychar <= Lexer.EOF)
            {
 -          yychar = yytoken = EOF;
 -          yycdebug ("Now at end of input.\n");
 +            yychar = yytoken = Lexer.EOF;
 +            yycdebug ("Now at end of input.\n");
            }
          else
            {
 -          yytoken = yytranslate_ (yychar);
 -          yy_symbol_print ("Next token is", yytoken,
 -                           yylval]b4_locations_if([, yylloc])[);
 +            yytoken = yytranslate_ (yychar);
 +            yy_symbol_print ("Next token is", yytoken,
 +                             yylval]b4_locations_if([, yylloc])[);
            }
  
          /* If the proper action on seeing token YYTOKEN is to reduce or to
          /* <= 0 means reduce or error.  */
          else if ((yyn = yytable_[yyn]) <= 0)
            {
 -          if (yy_table_value_is_error_ (yyn))
 -            label = YYERRLAB;
 -          else
 -            {
 -              yyn = -yyn;
 -              label = YYREDUCE;
 -            }
 +            if (yy_table_value_is_error_ (yyn))
 +              label = YYERRLAB;
 +            else
 +              {
 +                yyn = -yyn;
 +                label = YYREDUCE;
 +              }
            }
  
          else
            {
              /* Shift the lookahead token.  */
 -          yy_symbol_print ("Shifting", yytoken,
 -                           yylval]b4_locations_if([, yylloc])[);
 +            yy_symbol_print ("Shifting", yytoken,
 +                             yylval]b4_locations_if([, yylloc])[);
  
              /* Discard the token being shifted.  */
              yychar = yyempty_;
        case YYREDUCE:
          yylen = yyr2_[yyn];
          label = yyaction (yyn, yystack, yylen);
 -      yystate = yystack.stateAt (0);
 +        yystate = yystack.stateAt (0);
          break;
  
        /*------------------------------------.
          ]b4_locations_if([yyerrloc = yylloc;])[
          if (yyerrstatus_ == 3)
            {
 -          /* If just tried and failed to reuse lookahead token after an
 -           error, discard it.  */
 -
 -          if (yychar <= EOF)
 -            {
 -            /* Return failure if at end of input.  */
 -            if (yychar == EOF)
 -              return false;
 -            }
 -          else
 -            yychar = yyempty_;
 +        /* If just tried and failed to reuse lookahead token after an
 +         error, discard it.  */
 +
 +        if (yychar <= Lexer.EOF)
 +          {
 +          /* Return failure if at end of input.  */
 +          if (yychar == Lexer.EOF)
 +            return false;
 +          }
 +        else
 +              yychar = yyempty_;
            }
  
          /* Else will try to reuse lookahead token after shifting the error
        | yyerrlab1 -- common code for both syntax error and YYERROR.  |
        `-------------------------------------------------------------*/
        case YYERRLAB1:
 -        yyerrstatus_ = 3;     /* Each real token shifted decrements this.  */
 +        yyerrstatus_ = 3;       /* Each real token shifted decrements this.  */
  
          for (;;)
            {
 -          yyn = yypact_[yystate];
 -          if (!yy_pact_value_is_default_ (yyn))
 -            {
 -              yyn += yyterror_;
 -              if (0 <= yyn && yyn <= yylast_ && yycheck_[yyn] == yyterror_)
 -                {
 -                  yyn = yytable_[yyn];
 -                  if (0 < yyn)
 -                    break;
 -                }
 -            }
 -
 -          /* Pop the current state because it cannot handle the error token.  */
 -          if (yystack.height == 0)
 -            return false;
 -
 -          ]b4_locations_if([yyerrloc = yystack.locationAt (0);])[
 -          yystack.pop ();
 -          yystate = yystack.stateAt (0);
 -          if (yydebug > 0)
 -            yystack.print (yyDebugStream);
 +            yyn = yypact_[yystate];
 +            if (!yy_pact_value_is_default_ (yyn))
 +              {
 +                yyn += yyterror_;
 +                if (0 <= yyn && yyn <= yylast_ && yycheck_[yyn] == yyterror_)
 +                  {
 +                    yyn = yytable_[yyn];
 +                    if (0 < yyn)
 +                      break;
 +                  }
 +              }
 +
 +            /* Pop the current state because it cannot handle the error token.  */
 +            if (yystack.height == 0)
 +              return false;
 +
 +            ]b4_locations_if([yyerrloc = yystack.locationAt (0);])[
 +            yystack.pop ();
 +            yystate = yystack.stateAt (0);
 +            if (yydebug > 0)
 +              yystack.print (yyDebugStream);
            }
  
 -      ]b4_locations_if([
 -      /* Muck with the stack to setup for yylloc.  */
 -      yystack.push (0, null, yylloc);
 -      yystack.push (0, null, yyerrloc);
 +        ]b4_locations_if([
 +        /* Muck with the stack to setup for yylloc.  */
 +        yystack.push (0, null, yylloc);
 +        yystack.push (0, null, yyerrloc);
          yyloc = yylloc (yystack, 2);
 -      yystack.pop (2);])[
 +        yystack.pop (2);])[
  
          /* Shift the error token.  */
          yy_symbol_print ("Shifting", yystos_[yyn],
 -                       yylval]b4_locations_if([, yyloc])[);
 +                         yylval]b4_locations_if([, yyloc])[);
  
          yystate = yyn;
 -      yystack.push (yyn, yylval]b4_locations_if([, yyloc])[);
 +        yystack.push (yyn, yylval]b4_locations_if([, yyloc])[);
          label = YYNEWSTATE;
          break;
  
  
    // Generate an error message.
    private String yysyntax_error (int yystate, int tok)
 -  {
 -    if (errorVerbose)
 +  {]b4_error_verbose_if([[
 +    if (yyErrorVerbose)
        {
          /* There are many possibilities here to consider:
 -           - Assume YYFAIL is not used.  It's too flawed to consider.
 -             See
 -             <http://lists.gnu.org/archive/html/bison-patches/2009-12/msg00024.html>
 -             for details.  YYERROR is fine as it does not invoke this
 -             function.
             - If this state is a consistent state with a default action,
               then the only way this function was invoked is if the
               default action is an error action.  In that case, don't
              return res.toString ();
            }
        }
 -
 +]])[
      return "syntax error";
    }
  
      return yyvalue == yytable_ninf_;
    }
  
 -  /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
 -     STATE-NUM.  */
    private static final ]b4_int_type_for([b4_pact])[ yypact_ninf_ = ]b4_pact_ninf[;
 -  private static final ]b4_int_type_for([b4_pact])[ yypact_[] =
 -  {
 -    ]b4_pact[
 -  };
 -
 -  /* YYDEFACT[S] -- default reduction number in state S.  Performed when
 -     YYTABLE doesn't specify something else to do.  Zero means the
 -     default is an error.  */
 -  private static final ]b4_int_type_for([b4_defact])[ yydefact_[] =
 -  {
 -    ]b4_defact[
 -  };
 -
 -  /* YYPGOTO[NTERM-NUM].  */
 -  private static final ]b4_int_type_for([b4_pgoto])[ yypgoto_[] =
 -  {
 -    ]b4_pgoto[
 -  };
 -
 -  /* YYDEFGOTO[NTERM-NUM].  */
 -  private static final ]b4_int_type_for([b4_defgoto])[
 -  yydefgoto_[] =
 -  {
 -    ]b4_defgoto[
 -  };
 -
 -  /* 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.  */
    private static final ]b4_int_type_for([b4_table])[ yytable_ninf_ = ]b4_table_ninf[;
 -  private static final ]b4_int_type_for([b4_table])[
 -  yytable_[] =
 -  {
 -    ]b4_table[
 -  };
  
 -  /* YYCHECK.  */
 -  private static final ]b4_int_type_for([b4_check])[
 -  yycheck_[] =
 -  {
 -    ]b4_check[
 -  };
 -
 -  /* STOS_[STATE-NUM] -- The (internal number of the) accessing
 -     symbol of state STATE-NUM.  */
 -  private static final ]b4_int_type_for([b4_stos])[
 -  yystos_[] =
 -  {
 -    ]b4_stos[
 -  };
 -
 -  /* TOKEN_NUMBER_[YYLEX-NUM] -- Internal symbol number corresponding
 -     to YYLEX-NUM.  */
 -  private static final ]b4_int_type_for([b4_toknum])[
 -  yytoken_number_[] =
 -  {
 -    ]b4_toknum[
 -  };
 -
 -  /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
 -  private static final ]b4_int_type_for([b4_r1])[
 -  yyr1_[] =
 -  {
 -    ]b4_r1[
 -  };
 -
 -  /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
 -  private static final ]b4_int_type_for([b4_r2])[
 -  yyr2_[] =
 -  {
 -    ]b4_r2[
 -  };
 +  ]b4_parser_tables_define[
 +  ]b4_integral_parser_table_define([token_number], [b4_toknum],
 +     [TOKEN_NUMBER_[YYLEX-NUM] -- Internal symbol number corresponding
 +     to YYLEX-NUM.])[
  
    /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
       First, the terminals, then, starting at \a yyntokens_, nonterminals.  */
 -  private static final String yytname_[] =
 -  {
 -    ]b4_tname[
 -  };
 -
 -  /* YYRHS -- A `-1'-separated list of the rules' RHS.  */
 -  private static final ]b4_int_type_for([b4_rhs])[ yyrhs_[] =
 -  {
 -    ]b4_rhs[
 -  };
 +  ]b4_typed_parser_table_define([String], [tname], [b4_tname])[
  
 -  /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
 -     YYRHS.  */
 -  private static final ]b4_int_type_for([b4_prhs])[ yyprhs_[] =
 -  {
 -    ]b4_prhs[
 -  };
 -
 -  /* YYRLINE[YYN] -- Source line where rule number YYN was defined.  */
 -  private static final ]b4_int_type_for([b4_rline])[ yyrline_[] =
 -  {
 -    ]b4_rline[
 -  };
 +  ]b4_integral_parser_table_define([rline], [b4_rline],
 +  [YYRLINE[YYN] -- Source line where rule number YYN was defined.])[
  
    // Report on the debug stream that the rule yyrule is going to be reduced.
    private void yy_reduce_print (int yyrule, YYStack yystack)
      int yynrhs = yyr2_[yyrule];
      /* Print the symbols being reduced, and their result.  */
      yycdebug ("Reducing stack by rule " + (yyrule - 1)
 -            + " (line " + yylno + "), ");
 +              + " (line " + yylno + "), ");
  
      /* The symbols being reduced.  */
      for (int yyi = 0; yyi < yynrhs; yyi++)
        yy_symbol_print ("   $" + (yyi + 1) + " =",
 -                     yyrhs_[yyprhs_[yyrule] + yyi],
 -                     ]b4_rhs_value(yynrhs, yyi + 1)b4_locations_if([,
 -                     b4_rhs_location(yynrhs, yyi + 1)])[);
 +                       yystos_[yystack.stateAt(yynrhs - (yyi + 1))],
 +                       ]b4_rhs_value(yynrhs, yyi + 1)b4_locations_if([,
 +                       b4_rhs_location(yynrhs, yyi + 1)])[);
    }
  
    /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
 -  private static final ]b4_int_type_for([b4_translate])[ yytranslate_table_[] =
 -  {
 -    ]b4_translate[
 -  };
 +  ]b4_integral_parser_table_define([translate_table], [b4_translate])[
  
    private static final ]b4_int_type_for([b4_translate])[ yytranslate_ (int t)
    {
@@@ -873,5 -923,5 +872,5 @@@ b4_percent_code_get[]dn
  
  }
  
 -b4_epilogue
 +b4_epilogue[]dnl
- m4_divert_pop(0)dnl
+ b4_output_end()
diff --combined data/location.cc
index 5879ea374e581bf331b67d30a67baa3c589cb5b1,58182a34acfe048966e8998eb29d1327ed9df45e..b49028f9559ac6ec0236486def75ea0fa92451c8
@@@ -1,6 -1,6 +1,6 @@@
  # C++ skeleton for Bison
  
 -# Copyright (C) 2002-2007, 2009-2012 Free Software Foundation, Inc.
 +# Copyright (C) 2002-2012 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
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
 +m4_pushdef([b4_copyright_years],
 +           [2002-2012])
  
 -b4_output_begin([b4_dir_prefix[]position.hh])
 -b4_copyright([Positions for Bison parsers in C++],
 -             [2002-2007, 2009-2012])[
 -
 -/**
 - ** \file ]b4_dir_prefix[position.hh
 - ** Define the ]b4_namespace_ref[::position class.
 - */
 -
 -]b4_cpp_guard_open([b4_dir_prefix[]position.hh])[
 -
 -# include <algorithm> // std::max
 -# include <iostream>
 -# include <string>
 -
 -]b4_null_define[
 -
 -]b4_namespace_open[
 -  /// Abstract a position.
 +# b4_position_define
 +# ------------------
 +# Define class position.
 +m4_define([b4_position_define],
 +[[  /// Abstract a position.
    class position
    {
    public:
        ostr << *pos.filename << ':';
      return ostr << pos.line << '.' << pos.column;
    }
 +]])
  
 -]b4_namespace_close[
 -]b4_cpp_guard_close([b4_dir_prefix[]position.hh])
 -b4_output_end()
 -
 -
 -b4_output_begin([b4_dir_prefix[]location.hh])
 -b4_copyright([Locations for Bison parsers in C++],
 -             [2002-2007, 2009-2012])[
  
 -/**
 - ** \file ]b4_dir_prefix[location.hh
 - ** Define the ]b4_namespace_ref[::location class.
 - */
 -
 -]b4_cpp_guard_open([b4_dir_prefix[]location.hh])[
 -
 -# include "position.hh"
 -
 -]b4_namespace_open[
 -
 -  /// Abstract a location.
 +# b4_location_define
 +# ------------------
 +m4_define([b4_location_define],
 +[[  /// Abstract a location.
    class location
    {
    public:
      position last = loc.end - 1;
      ostr << loc.begin;
      if (last.filename
 -      && (!loc.begin.filename
 -          || *loc.begin.filename != *last.filename))
 +        && (!loc.begin.filename
 +            || *loc.begin.filename != *last.filename))
        ostr << '-' << last;
      else if (loc.begin.line != last.line)
        ostr << '-' << last.line  << '.' << last.column;
        ostr << '-' << last.column;
      return ostr;
    }
 +]])
 +
  
- m4_divert_push(0)dnl
- @output(b4_dir_prefix[]position.hh@)@
 +# We do want M4 expansion after # for CPP macros.
 +m4_changecom()
 +b4_defines_if([
++b4_output_begin([b4_dir_prefix[]position.hh])
 +b4_copyright([Positions for Bison parsers in C++])[
 +
 +/**
 + ** \file ]b4_dir_prefix[position.hh
 + ** Define the ]b4_namespace_ref[::position class.
 + */
 +
 +]b4_cpp_guard_open([b4_dir_prefix[]position.hh])[
 +
 +# include <algorithm> // std::max
 +# include <iostream>
 +# include <string>
 +
 +]b4_null_define[
 +
 +]b4_namespace_open[
 +]b4_position_define[
  ]b4_namespace_close[
- @output(b4_dir_prefix[]location.hh@)@
 +]b4_cpp_guard_close([b4_dir_prefix[]position.hh])
++b4_output_end()
++
++
++b4_output_begin([b4_dir_prefix[]location.hh])
 +b4_copyright([Locations for Bison parsers in C++])[
 +
 +/**
 + ** \file ]b4_dir_prefix[location.hh
 + ** Define the ]b4_namespace_ref[::location class.
 + */
  
 +]b4_cpp_guard_open([b4_dir_prefix[]location.hh])[
 +
 +# include "position.hh"
 +
 +]b4_namespace_open[
 +]b4_location_define[
 +]b4_namespace_close[
  ]b4_cpp_guard_close([b4_dir_prefix[]location.hh])
- m4_divert_pop(0)
- ])# b4_defines_if
- m4_popdef([b4_copyright_years])dnl
- m4_changecom([#])
+ b4_output_end()
++])
++
++
++m4_popdef([b4_copyright_years])
diff --combined data/stack.hh
index bd94eb2da5dded1256f7ed840257ae72d4adebf3,ab1049c184d4f111513e6bb33ecb00f8b888bab9..4fd136fd2d55f9203aed75b2728be67665aeae9e
  m4_pushdef([b4_copyright_years],
             [2002-2012])
  
 -b4_output_begin([b4_dir_prefix[]stack.hh])
 -b4_copyright([Stack handling for Bison parsers in C++],
 -             [2002-2012])[
 -
 -/**
 - ** \file ]b4_dir_prefix[stack.hh
 - ** Define the ]b4_namespace_ref[::stack class.
 - */
 -
 -]b4_cpp_guard_open([b4_dir_prefix[]stack.hh])[
 -
 -# include <deque>
 -
 -]b4_namespace_open[
 -  template <class T, class S = std::deque<T> >
 +# b4_stack_define
 +# ---------------
 +m4_define([b4_stack_define],
 +[[  template <class T, class S = std::deque<T> >
    class stack
    {
    public:
      typedef typename S::reverse_iterator iterator;
      typedef typename S::const_reverse_iterator const_iterator;
  
 -    stack () : seq_ ()
 +    stack ()
 +      : seq_ ()
      {
      }
  
 -    stack (unsigned int n) : seq_ (n)
 +    stack (unsigned int n)
 +      : seq_ (n)
      {
      }
  
      }
  
      inline
 -    unsigned int
 -    height () const
 +    typename S::size_type
 +    size () const
      {
        return seq_.size ();
      }
  
 -    inline const_iterator begin () const { return seq_.rbegin (); }
 -    inline const_iterator end () const { return seq_.rend (); }
 +    inline
 +    const_iterator
 +    begin () const
 +    {
 +      return seq_.rbegin ();
 +    }
 +
 +    inline
 +    const_iterator
 +    end () const
 +    {
 +      return seq_.rend ();
 +    }
  
    private:
 +    /// The wrapped container.
      S seq_;
    };
  
      const S& stack_;
      unsigned int range_;
    };
- [# We do want M4 expansion after # for CPP macros.
- m4_changecom()
- m4_divert_push(0)dnl
- @output(b4_dir_prefix[]stack.hh@)@
 +]])
 +
 +b4_defines_if(
++[b4_output_begin([b4_dir_prefix[]stack.hh])
 +b4_copyright([Stack handling for Bison parsers in C++])[
 +
 +/**
 + ** \file ]b4_dir_prefix[stack.hh
 + ** Define the ]b4_namespace_ref[::stack class.
 + */
 +
 +]b4_cpp_guard_open([b4_dir_prefix[]stack.hh])[
 +
 +# include <deque>
 +
 +]b4_namespace_open[
 +]b4_stack_define[
  ]b4_namespace_close[
  
  ]b4_cpp_guard_close([b4_dir_prefix[]stack.hh])
- m4_divert_pop(0)
- m4_popdef([b4_copyright_years])dnl
- m4_changecom([#])
+ b4_output_end()
 +])
+ m4_popdef([b4_copyright_years])
diff --combined data/yacc.c
index 2b6d10acbb3b7e5c67bf9d881a4d2951a42b6bf3,810e2b21a0726c8544433e37a1160c6adf477c93..9bd80280bd7d26cdbe06c46b56d706b10f76b456
@@@ -1,12 -1,10 +1,12 @@@
                                                               -*- C -*-
 -
  # Yacc compatible skeleton for Bison
  
  # Copyright (C) 1984, 1989-1990, 2000-2012 Free Software Foundation,
  # Inc.
  
 +m4_pushdef([b4_copyright_years],
 +           [1984, 1989-1990, 2000-2012])
 +
  # 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
  # the Free Software Foundation, either version 3 of the License, or
@@@ -97,7 -95,7 +97,7 @@@ m4_define([b4_yyerror_arg_loc_if]
  # Arguments passed to yyerror: user args plus yylloc.
  m4_define([b4_yyerror_args],
  [b4_yyerror_arg_loc_if([&yylloc, ])dnl
 -m4_ifset([b4_parse_param], [b4_c_args(b4_parse_param), ])])
 +m4_ifset([b4_parse_param], [b4_args(b4_parse_param), ])])
  
  
  # b4_lex_param
@@@ -129,7 -127,7 +129,7 @@@ m4_define([b4_int_type]
  
         m4_eval([0 <= $1]),                [1], [unsigned int],
  
 -                                             [int])])
 +                                               [int])])
  
  
  ## ----------------- ##
  # --------------------
  # Expansion of $<TYPE>$.
  m4_define([b4_lhs_value],
 -[(yyval[]m4_ifval([$1], [.$1]))])
 +[b4_symbol_value(yyval, [$1])])
  
  
  # b4_rhs_value(RULE-LENGTH, NUM, [TYPE])
  # Expansion of $<TYPE>NUM, where the current rule has RULE-LENGTH
  # symbols on RHS.
  m4_define([b4_rhs_value],
 -[(yyvsp@{($2) - ($1)@}m4_ifval([$3], [.$3]))])
 +          [b4_symbol_value([yyvsp@{b4_subtract([$2], [$1])@}], [$3])])
  
  
  
@@@ -169,7 -167,7 +169,7 @@@ m4_define([b4_lhs_location]
  # Expansion of @NUM, where the current rule has RULE-LENGTH symbols
  # on RHS.
  m4_define([b4_rhs_location],
 -[(yylsp@{($2) - ($1)@})])
 +          [(yylsp@{b4_subtract([$2], [$1])@})])
  
  
  ## -------------- ##
@@@ -276,19 -274,19 +276,19 @@@ enum { YYPUSH_MORE = 4 }
  
  typedef struct ]b4_prefix[pstate ]b4_prefix[pstate;
  
 -]b4_pull_if([b4_c_function_decl([b4_prefix[parse]], [[int]], b4_parse_param)
 -])b4_c_function_decl([b4_prefix[push_parse]], [[int]],
 +]b4_pull_if([b4_function_declare([b4_prefix[parse]], [[int]], b4_parse_param)
 +])b4_function_declare([b4_prefix[push_parse]], [[int]],
    [[b4_prefix[pstate *ps]], [[ps]]]b4_pure_if([,
    [[[int pushed_char]], [[pushed_char]]],
    [[b4_api_PREFIX[STYPE const *pushed_val]], [[pushed_val]]]b4_locations_if([,
    [[b4_api_PREFIX[LTYPE *pushed_loc]], [[pushed_loc]]]])])m4_ifset([b4_parse_param], [,
    b4_parse_param]))
 -b4_pull_if([b4_c_function_decl([b4_prefix[pull_parse]], [[int]],
 +b4_pull_if([b4_function_declare([b4_prefix[pull_parse]], [[int]],
    [[b4_prefix[pstate *ps]], [[ps]]]m4_ifset([b4_parse_param], [,
    b4_parse_param]))])
 -b4_c_function_decl([b4_prefix[pstate_new]], [b4_prefix[pstate *]],
 +b4_function_declare([b4_prefix[pstate_new]], [b4_prefix[pstate *]],
                      [[[void]], []])
 -b4_c_function_decl([b4_prefix[pstate_delete]], [[void]],
 +b4_function_declare([b4_prefix[pstate_delete]], [[void]],
                     [[b4_prefix[pstate *ps]], [[ps]]])dnl
  ])
  
  # -------------------
  # When not the push parser.
  m4_define([b4_declare_yyparse_],
 -[[#ifdef YYPARSE_PARAM
 -]b4_c_function_decl(b4_prefix[parse], [int],
 -                    [[void *YYPARSE_PARAM], [YYPARSE_PARAM]])[
 -#else /* ! YYPARSE_PARAM */
 -]b4_c_function_decl(b4_prefix[parse], [int], b4_parse_param)[
 -#endif /* ! YYPARSE_PARAM */]dnl
 -])
 +[b4_function_declare(b4_prefix[parse], [int], b4_parse_param)])
  
  
  # b4_declare_yyparse
@@@ -315,22 -319,21 +315,19 @@@ m4_define([b4_shared_declarations]
  [b4_cpp_guard_open([b4_spec_defines_file])[
  ]b4_declare_yydebug[
  ]b4_percent_code_get([[requires]])[
 -]b4_token_enums_defines(b4_tokens)[
 +]b4_token_enums_defines[
  ]b4_declare_yylstype[
  ]b4_declare_yyparse[
  ]b4_percent_code_get([[provides]])[
  ]b4_cpp_guard_close([b4_spec_defines_file])[]dnl
  ])
  
 -
  ## -------------- ##
  ## Output files.  ##
  ## -------------- ##
  
- # We do want M4 expansion after # for CPP macros.
- m4_changecom()
- m4_divert_push(0)dnl
- @output(b4_parser_file_name@)@
+ b4_output_begin([b4_parser_file_name])
 -b4_copyright([Bison implementation for Yacc-like parsers in C],
 -             [1984, 1989-1990, 2000-2012])[
 +b4_copyright([Bison implementation for Yacc-like parsers in C])[
  
  /* C LALR(1) parser skeleton written by Richard Stallman, by
     simplifying the original so-called "semantic" parser.  */
@@@ -374,7 -377,7 +371,7 @@@ m4_if(b4_api_prefix, [yy], []
  # undef YYERROR_VERBOSE
  # define YYERROR_VERBOSE 1
  #else
 -# define YYERROR_VERBOSE ]b4_error_verbose_flag[
 +# define YYERROR_VERBOSE ]b4_error_verbose_if([1], [0])[
  #endif
  
  ]m4_ifval(m4_quote(b4_spec_defines_file),
@@@ -399,8 -402,10 +396,8 @@@ typedef unsigned char yytype_uint8
  
  #ifdef YYTYPE_INT8
  typedef YYTYPE_INT8 yytype_int8;
 -#elif ]b4_c_modern[
 -typedef signed char yytype_int8;
  #else
 -typedef short int yytype_int8;
 +typedef signed char yytype_int8;
  #endif
  
  #ifdef YYTYPE_UINT16
@@@ -420,7 -425,7 +417,7 @@@ typedef short int yytype_int16
  #  define YYSIZE_T __SIZE_TYPE__
  # elif defined size_t
  #  define YYSIZE_T size_t
 -# elif ! defined YYSIZE_T && ]b4_c_modern[
 +# elif ! defined YYSIZE_T
  #  include <stddef.h> /* INFRINGES ON USER NAME SPACE */
  #  define YYSIZE_T size_t
  # else
  #endif
  
  /* Suppress unused-variable warnings by "using" E.  */
 -#if ! defined lint || defined __GNUC__
 +#ifdef __GNUC__
  # define YYUSE(E) ((void) (E))
  #else
  # define YYUSE(E) /* empty */
  #endif
  
 -/* Identity function, used to suppress warnings about constant conditions.  */
 -#ifndef lint
 -# define YYID(N) (N)
 -#else
 -]b4_c_function_def([YYID], [static int], [[int yyi], [yyi]])[
 -{
 -  return yyi;
 -}
 -#endif
 -
  #if ]b4_lac_if([[1]], [[! defined yyoverflow || YYERROR_VERBOSE]])[
  
  /* The parser invokes alloca or malloc; define the necessary symbols.  */]dnl
@@@ -467,7 -482,7 +464,7 @@@ b4_push_if([], [b4_lac_if([], [
  #    define alloca _alloca
  #   else
  #    define YYSTACK_ALLOC alloca
 -#    if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS && ]b4_c_modern[
 +#    if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS
  #     include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
        /* Use EXIT_SUCCESS as a witness for stdlib.h.  */
  #     ifndef EXIT_SUCCESS
  
  # ifdef YYSTACK_ALLOC
     /* Pacify GCC's `empty if-body' warning.  */
 -#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0))
 +#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
  #  ifndef YYSTACK_ALLOC_MAXIMUM
      /* The OS might guarantee only one guard page at the bottom of the stack,
         and a page size can be as small as 4096 bytes.  So we cannot safely
  #  endif
  #  if (defined __cplusplus && ! defined EXIT_SUCCESS \
         && ! ((defined YYMALLOC || defined malloc) \
 -           && (defined YYFREE || defined free)))
 +             && (defined YYFREE || defined free)))
  #   include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
  #   ifndef EXIT_SUCCESS
  #    define EXIT_SUCCESS 0
  #  endif
  #  ifndef YYMALLOC
  #   define YYMALLOC malloc
 -#   if ! defined malloc && ! defined EXIT_SUCCESS && ]b4_c_modern[
 +#   if ! defined malloc && ! defined EXIT_SUCCESS
  void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
  #   endif
  #  endif
  #  ifndef YYFREE
  #   define YYFREE free
 -#   if ! defined free && ! defined EXIT_SUCCESS && ]b4_c_modern[
 +#   if ! defined free && ! defined EXIT_SUCCESS
  void free (void *); /* INFRINGES ON USER NAME SPACE */
  #   endif
  #  endif
  
  #if (! defined yyoverflow \
       && (! defined __cplusplus \
 -       || (]b4_locations_if([[defined ]b4_api_PREFIX[LTYPE_IS_TRIVIAL && ]b4_api_PREFIX[LTYPE_IS_TRIVIAL \
 -           && ]])[defined ]b4_api_PREFIX[STYPE_IS_TRIVIAL && ]b4_api_PREFIX[STYPE_IS_TRIVIAL)))
 +         || (]b4_locations_if([[defined ]b4_api_PREFIX[LTYPE_IS_TRIVIAL && ]b4_api_PREFIX[LTYPE_IS_TRIVIAL \
 +             && ]])[defined ]b4_api_PREFIX[STYPE_IS_TRIVIAL && ]b4_api_PREFIX[STYPE_IS_TRIVIAL)))
  
  /* A type that is properly aligned for any stack member.  */
  union yyalloc
     elements in the stack, and YYPTR gives the new location of the
     stack.  Advance YYPTR to a properly aligned location for the next
     stack.  */
 -# define YYSTACK_RELOCATE(Stack_alloc, Stack)                         \
 -    do                                                                        \
 -      {                                                                       \
 -      YYSIZE_T yynewbytes;                                            \
 -      YYCOPY (&yyptr->Stack_alloc, Stack, yysize);                    \
 -      Stack = &yyptr->Stack_alloc;                                    \
 -      yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
 -      yyptr += yynewbytes / sizeof (*yyptr);                          \
 -      }                                                                       \
 -    while (YYID (0))
 +# define YYSTACK_RELOCATE(Stack_alloc, Stack)                           \
 +    do                                                                  \
 +      {                                                                 \
 +        YYSIZE_T yynewbytes;                                            \
 +        YYCOPY (&yyptr->Stack_alloc, Stack, yysize);                    \
 +        Stack = &yyptr->Stack_alloc;                                    \
 +        yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
 +        yyptr += yynewbytes / sizeof (*yyptr);                          \
 +      }                                                                 \
 +    while (0)
  
  #endif
  
            for (yyi = 0; yyi < (Count); yyi++)   \
              (Dst)[yyi] = (Src)[yyi];            \
          }                                       \
 -      while (YYID (0))
 +      while (0)
  #  endif
  # endif
  #endif /* !YYCOPY_NEEDED */
  #define YYNNTS  ]b4_nterms_number[
  /* YYNRULES -- Number of rules.  */
  #define YYNRULES  ]b4_rules_number[
 -/* YYNRULES -- Number of states.  */
 +/* YYNSTATES -- Number of states.  */
  #define YYNSTATES  ]b4_states_number[
  
 -/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
 +/* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned
 +   by yylex, with out-of-bounds checking.  */
  #define YYUNDEFTOK  ]b4_undef_token_number[
  #define YYMAXUTOK   ]b4_user_token_number_max[
  
 -#define YYTRANSLATE(YYX)                                              \
 +#define YYTRANSLATE(YYX)                                                \
    ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
  
 -/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX.  */
 +/* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM
 +   as returned by yylex, without out-of-bounds checking.  */
  static const ]b4_int_type_for([b4_translate])[ yytranslate[] =
  {
    ]b4_translate[
  };
  
  #if ]b4_api_PREFIX[DEBUG
 -/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
 -   YYRHS.  */
 -static const ]b4_int_type_for([b4_prhs])[ yyprhs[] =
 -{
 -  ]b4_prhs[
 -};
 -
 -/* YYRHS -- A `-1'-separated list of the rules' RHS.  */
 -static const ]b4_int_type_for([b4_rhs])[ yyrhs[] =
 -{
 -  ]b4_rhs[
 -};
 -
 -/* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
 -static const ]b4_int_type_for([b4_rline])[ yyrline[] =
 -{
 -  ]b4_rline[
 -};
 +]b4_integral_parser_table_define([rline], [b4_rline],
 +     [YYRLINE[YYN] -- Source line where rule number YYN was defined.])[
  #endif
  
  #if ]b4_api_PREFIX[DEBUG || YYERROR_VERBOSE || ]b4_token_table_flag[
@@@ -629,35 -658,105 +626,35 @@@ static const char *const yytname[] 
  #endif
  
  # ifdef YYPRINT
 -/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
 -   token YYLEX-NUM.  */
 +/* YYTOKNUM[NUM] -- (External) token number corresponding to the
 +   (internal) symbol number NUM (which must be that of a token).  */
  static const ]b4_int_type_for([b4_toknum])[ yytoknum[] =
  {
    ]b4_toknum[
  };
  # endif
  
 -/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
 -static const ]b4_int_type_for([b4_r1])[ yyr1[] =
 -{
 -  ]b4_r1[
 -};
 -
 -/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
 -static const ]b4_int_type_for([b4_r2])[ yyr2[] =
 -{
 -  ]b4_r2[
 -};
 -
 -/* YYDEFACT[STATE-NAME] -- Default reduction number in state STATE-NUM.
 -   Performed when YYTABLE doesn't specify something else to do.  Zero
 -   means the default is an error.  */
 -static const ]b4_int_type_for([b4_defact])[ yydefact[] =
 -{
 -  ]b4_defact[
 -};
 -
 -/* YYDEFGOTO[NTERM-NUM].  */
 -static const ]b4_int_type_for([b4_defgoto])[ yydefgoto[] =
 -{
 -  ]b4_defgoto[
 -};
 -
 -/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
 -   STATE-NUM.  */
  #define YYPACT_NINF ]b4_pact_ninf[
 -static const ]b4_int_type_for([b4_pact])[ yypact[] =
 -{
 -  ]b4_pact[
 -};
 -
 -/* YYPGOTO[NTERM-NUM].  */
 -static const ]b4_int_type_for([b4_pgoto])[ yypgoto[] =
 -{
 -  ]b4_pgoto[
 -};
 -
 -/* 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.  */
 -#define YYTABLE_NINF ]b4_table_ninf[
 -static const ]b4_int_type_for([b4_table])[ yytable[] =
 -{
 -  ]b4_table[
 -};
  
  #define yypact_value_is_default(Yystate) \
    ]b4_table_value_equals([[pact]], [[Yystate]], [b4_pact_ninf])[
  
 +#define YYTABLE_NINF ]b4_table_ninf[
 +
  #define yytable_value_is_error(Yytable_value) \
    ]b4_table_value_equals([[table]], [[Yytable_value]], [b4_table_ninf])[
  
 -static const ]b4_int_type_for([b4_check])[ yycheck[] =
 -{
 -  ]b4_check[
 -};
 +]b4_parser_tables_define[
  
 -/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
 -   symbol of state STATE-NUM.  */
 -static const ]b4_int_type_for([b4_stos])[ yystos[] =
 -{
 -  ]b4_stos[
 -};
 +#define yyerrok         (yyerrstatus = 0)
 +#define yyclearin       (yychar = YYEMPTY)
 +#define YYEMPTY         (-2)
 +#define YYEOF           0
 +
 +#define YYACCEPT        goto yyacceptlab
 +#define YYABORT         goto yyabortlab
 +#define YYERROR         goto yyerrorlab
  
 -#define yyerrok               (yyerrstatus = 0)
 -#define yyclearin     (yychar = YYEMPTY)
 -#define YYEMPTY               (-2)
 -#define YYEOF         0
 -
 -#define YYACCEPT      goto yyacceptlab
 -#define YYABORT               goto yyabortlab
 -#define YYERROR               goto yyerrorlab
 -
 -
 -/* Like YYERROR except do call yyerror.  This remains here temporarily
 -   to ease the transition to the new meaning of YYERROR, for GCC.
 -   Once GCC version 2 has supplanted version 1, this can go.  However,
 -   YYFAIL appears to be in use.  Nevertheless, it is formally deprecated
 -   in Bison 2.4.2's NEWS entry, where a plan to phase it out is
 -   discussed.  */
 -
 -#define YYFAIL                goto yyerrlab
 -#if defined YYFAIL
 -  /* This is here to suppress warnings from the GCC cpp's
 -     -Wunused-macros.  Normally we don't worry about that warning, but
 -     some users do, and we want to make it easy for users to remove
 -     YYFAIL uses, which will produce warnings from Bison 2.5.  */
 -#endif
  
  #define YYRECOVERING()  (!!yyerrstatus)
  
    else                                                          \
      {                                                           \
        yyerror (]b4_yyerror_args[YY_("syntax error: cannot back up")); \
 -      YYERROR;                                                        \
 -    }                                                         \
 -while (YYID (0))
 +      YYERROR;                                                  \
 +    }                                                           \
 +while (0)
  
  /* Error token number */
 -#define YYTERROR      1
 -#define YYERRCODE     256
 +#define YYTERROR        1
 +#define YYERRCODE       256
  
  ]b4_locations_if([[
  ]b4_yylloc_default_define[
  #ifdef YYLEX_PARAM
  # define YYLEX yylex (]b4_pure_if([&yylval[]b4_locations_if([, &yylloc]), ])[YYLEX_PARAM)
  #else
 -# define YYLEX ]b4_c_function_call([yylex], [int], b4_lex_param)[
 +# define YYLEX ]b4_function_call([yylex], [int], b4_lex_param)[
  #endif
  
  /* Enable debugging if requested.  */
  #  define YYFPRINTF fprintf
  # endif
  
 -# define YYDPRINTF(Args)                      \
 -do {                                          \
 -  if (yydebug)                                        \
 -    YYFPRINTF Args;                           \
 -} while (YYID (0))
 -
 -# define YY_SYMBOL_PRINT(Title, Type, Value, Location)                          \
 -do {                                                                    \
 -  if (yydebug)                                                                  \
 -    {                                                                   \
 -      YYFPRINTF (stderr, "%s ", Title);                                         \
 -      yy_symbol_print (stderr,                                                  \
 -                Type, Value]b4_locations_if([, Location])[]b4_user_args[); \
 -      YYFPRINTF (stderr, "\n");                                                 \
 -    }                                                                   \
 -} while (YYID (0))
 -
 -]b4_yy_symbol_print_generate([b4_c_function_def])[
 +# define YYDPRINTF(Args)                        \
 +do {                                            \
 +  if (yydebug)                                  \
 +    YYFPRINTF Args;                             \
 +} while (0)
 +
 +# define YY_SYMBOL_PRINT(Title, Type, Value, Location)                    \
 +do {                                                                      \
 +  if (yydebug)                                                            \
 +    {                                                                     \
 +      YYFPRINTF (stderr, "%s ", Title);                                   \
 +      yy_symbol_print (stderr,                                            \
 +                  Type, Value]b4_locations_if([, Location])[]b4_user_args[); \
 +      YYFPRINTF (stderr, "\n");                                           \
 +    }                                                                     \
 +} while (0)
 +
 +]b4_yy_symbol_print_define[
  
  /*------------------------------------------------------------------.
  | yy_stack_print -- Print the state stack from its BOTTOM up to its |
  | TOP (included).                                                   |
  `------------------------------------------------------------------*/
  
 -]b4_c_function_def([yy_stack_print], [static void],
 -                 [[yytype_int16 *yybottom], [yybottom]],
 -                 [[yytype_int16 *yytop],    [yytop]])[
 +]b4_function_define([yy_stack_print], [static void],
 +                   [[yytype_int16 *yybottom], [yybottom]],
 +                   [[yytype_int16 *yytop],    [yytop]])[
  {
    YYFPRINTF (stderr, "Stack now");
    for (; yybottom <= yytop; yybottom++)
    YYFPRINTF (stderr, "\n");
  }
  
 -# define YY_STACK_PRINT(Bottom, Top)                          \
 -do {                                                          \
 -  if (yydebug)                                                        \
 -    yy_stack_print ((Bottom), (Top));                         \
 -} while (YYID (0))
 +# define YY_STACK_PRINT(Bottom, Top)                            \
 +do {                                                            \
 +  if (yydebug)                                                  \
 +    yy_stack_print ((Bottom), (Top));                           \
 +} while (0)
  
  
  /*------------------------------------------------.
  | Report that the YYRULE is going to be reduced.  |
  `------------------------------------------------*/
  
 -]b4_c_function_def([yy_reduce_print], [static void],
 -                 [[YYSTYPE *yyvsp], [yyvsp]],
 +]b4_function_define([yy_reduce_print], [static void],
 +                   [[yytype_int16 *yyssp], [yyssp]],
 +                   [[YYSTYPE *yyvsp], [yyvsp]],
      b4_locations_if([[[YYLTYPE *yylsp], [yylsp]],
 -                 ])[[int yyrule], [yyrule]]m4_ifset([b4_parse_param], [,
 -                 b4_parse_param]))[
 +                   ])[[int yyrule], [yyrule]]m4_ifset([b4_parse_param], [,
 +                   b4_parse_param]))[
  {
 +  unsigned long int yylno = yyrline[yyrule];
    int yynrhs = yyr2[yyrule];
    int yyi;
 -  unsigned long int yylno = yyrline[yyrule];
    YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
 -           yyrule - 1, yylno);
 +             yyrule - 1, yylno);
    /* The symbols being reduced.  */
    for (yyi = 0; yyi < yynrhs; yyi++)
      {
        YYFPRINTF (stderr, "   $%d = ", yyi + 1);
 -      yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
 -                     &]b4_rhs_value(yynrhs, yyi + 1)[
 -                     ]b4_locations_if([, &]b4_rhs_location(yynrhs, yyi + 1))[]dnl
 -                     b4_user_args[);
 +      yy_symbol_print (stderr,
 +                       yystos[yyssp[yyi + 1 - yynrhs]],
 +                       &]b4_rhs_value(yynrhs, yyi + 1)[
 +                       ]b4_locations_if([, &]b4_rhs_location(yynrhs, yyi + 1))[]dnl
 +                       b4_user_args[);
        YYFPRINTF (stderr, "\n");
      }
  }
  
 -# define YY_REDUCE_PRINT(Rule)                \
 -do {                                  \
 -  if (yydebug)                                \
 -    yy_reduce_print (yyvsp, ]b4_locations_if([yylsp, ])[Rule]b4_user_args[); \
 -} while (YYID (0))
 +# define YY_REDUCE_PRINT(Rule)          \
 +do {                                    \
 +  if (yydebug)                          \
 +    yy_reduce_print (yyssp, yyvsp, ]b4_locations_if([yylsp, ])[Rule]b4_user_args[); \
 +} while (0)
  
  /* Nonzero means print parse trace.  It is left uninitialized so that
     multiple parsers can coexist.  */
@@@ -795,7 -892,7 +792,7 @@@ int yydebug
  
  
  /* YYINITDEPTH -- initial size of the parser's stacks.  */
 -#ifndef       YYINITDEPTH
 +#ifndef YYINITDEPTH
  # define YYINITDEPTH ]b4_stack_depth_init[
  #endif
  
@@@ -915,7 -1012,7 +912,7 @@@ do 
            goto yyerrlab;                                         \
        }                                                          \
      }                                                            \
 -} while (YYID (0))
 +} while (0)
  
  /* Discard any previous initial lookahead context because of Event,
     which may be a lookahead change or an invalidation of the currently
@@@ -938,7 -1035,7 +935,7 @@@ do 
                     Event "\n");                                          \
        yy_lac_established = 0;                                            \
      }                                                                    \
 -} while (YYID (0))
 +} while (0)
  #else
  # define YY_LAC_DISCARD(Event) yy_lac_established = 0
  #endif
@@@ -1054,7 -1151,7 +1051,7 @@@ yy_lac (yytype_int16 *yyesa, yytype_int
  #   define yystrlen strlen
  #  else
  /* Return the length of YYSTR.  */
 -]b4_c_function_def([yystrlen], [static YYSIZE_T],
 +]b4_function_define([yystrlen], [static YYSIZE_T],
     [[const char *yystr], [yystr]])[
  {
    YYSIZE_T yylen;
  #  else
  /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
     YYDEST.  */
 -]b4_c_function_def([yystpcpy], [static char *],
 +]b4_function_define([yystpcpy], [static char *],
     [[char *yydest], [yydest]], [[const char *yysrc], [yysrc]])[
  {
    char *yyd = yydest;
@@@ -1102,27 -1199,27 +1099,27 @@@ yytnamerr (char *yyres, const char *yys
        char const *yyp = yystr;
  
        for (;;)
 -      switch (*++yyp)
 -        {
 -        case '\'':
 -        case ',':
 -          goto do_not_strip_quotes;
 -
 -        case '\\':
 -          if (*++yyp != '\\')
 -            goto do_not_strip_quotes;
 -          /* Fall through.  */
 -        default:
 -          if (yyres)
 -            yyres[yyn] = *yyp;
 -          yyn++;
 -          break;
 -
 -        case '"':
 -          if (yyres)
 -            yyres[yyn] = '\0';
 -          return yyn;
 -        }
 +        switch (*++yyp)
 +          {
 +          case '\'':
 +          case ',':
 +            goto do_not_strip_quotes;
 +
 +          case '\\':
 +            if (*++yyp != '\\')
 +              goto do_not_strip_quotes;
 +            /* Fall through.  */
 +          default:
 +            if (yyres)
 +              yyres[yyn] = *yyp;
 +            yyn++;
 +            break;
 +
 +          case '"':
 +            if (yyres)
 +              yyres[yyn] = '\0';
 +            return yyn;
 +          }
      do_not_strip_quotes: ;
      }
  
@@@ -1161,6 -1258,10 +1158,6 @@@ yysyntax_error (YYSIZE_T *yymsg_alloc, 
    int yycount = 0;
  
    /* There are many possibilities here to consider:
 -     - Assume YYFAIL is not used.  It's too flawed to consider.  See
 -       <http://lists.gnu.org/archive/html/bison-patches/2009-12/msg00024.html>
 -       for details.  YYERROR is fine as it does not invoke this
 -       function.
       - If this state is a consistent state with a default action, then
         the only way this function was invoked is if the default action
         is an error action.  In that case, don't check for expected
  }
  #endif /* YYERROR_VERBOSE */
  
 -]b4_yydestruct_generate([b4_c_function_def])[
 +]b4_yydestruct_define[
  
  ]b4_pure_if([], [
  
@@@ -1306,13 -1407,13 +1303,13 @@@ struct yypstat
  
  static char yypstate_allocated = 0;]])b4_pull_if([
  
 -b4_c_function_def([[yyparse]], [[int]], b4_parse_param)[
 +b4_function_define([[yyparse]], [[int]], b4_parse_param)[
  {
    return yypull_parse (YY_NULL]m4_ifset([b4_parse_param],
 -                                  [[, ]b4_c_args(b4_parse_param)])[);
 +                                  [[, ]b4_args(b4_parse_param)])[);
  }
  
 -]b4_c_function_def([[yypull_parse]], [[int]],
 +]b4_function_define([[yypull_parse]], [[int]],
    [[[yypstate *yyps]], [[yyps]]]m4_ifset([b4_parse_param], [,
    b4_parse_param]))[
  {
    do {
      yychar = YYLEX;
      yystatus =
 -      yypush_parse (yyps_local]b4_pure_if([[, yychar, &yylval]b4_locations_if([[, &yylloc]])])m4_ifset([b4_parse_param], [, b4_c_args(b4_parse_param)])[);
 +      yypush_parse (yyps_local]b4_pure_if([[, yychar, &yylval]b4_locations_if([[, &yylloc]])])m4_ifset([b4_parse_param], [, b4_args(b4_parse_param)])[);
    } while (yystatus == YYPUSH_MORE);
    if (!yyps)
      yypstate_delete (yyps_local);
  }]])[
  
  /* Initialize the parser data structure.  */
 -]b4_c_function_def([[yypstate_new]], [[yypstate *]])[
 +]b4_function_define([[yypstate_new]], [[yypstate *]])[
  {
    yypstate *yyps;]b4_pure_if([], [[
    if (yypstate_allocated)
    return yyps;
  }
  
 -]b4_c_function_def([[yypstate_delete]], [[void]],
 +]b4_function_define([[yypstate_delete]], [[void]],
                     [[[yypstate *yyps]], [[yyps]]])[
  {
  #ifndef yyoverflow
  | yypush_parse.  |
  `---------------*/
  
 -]b4_c_function_def([[yypush_parse]], [[int]],
 +]b4_function_define([[yypush_parse]], [[int]],
    [[[yypstate *yyps]], [[yyps]]]b4_pure_if([,
    [[[int yypushed_char]], [[yypushed_char]]],
    [[[YYSTYPE const *yypushed_val]], [[yypushed_val]]]b4_locations_if([,
  | yyparse.  |
  `----------*/
  
 -#ifdef YYPARSE_PARAM
 -]b4_c_function_def([yyparse], [int],
 -                   [[void *YYPARSE_PARAM], [YYPARSE_PARAM]])[
 -#else /* ! YYPARSE_PARAM */
 -]b4_c_function_def([yyparse], [int], b4_parse_param)[
 -#endif]])[
 +]b4_function_define([yyparse], [int], b4_parse_param)])[
  {]b4_pure_if([b4_declare_scanner_communication_variables
  ])b4_push_if([b4_pure_if([], [[
    int yypushed_char = yychar;
@@@ -1493,26 -1599,26 +1490,26 @@@ b4_locations_if([[  yylsp[0] = ]b4_push
  
  #ifdef yyoverflow
        {
 -      /* Give user a chance to reallocate the stack.  Use copies of
 -         these so that the &'s don't force the real ones into
 -         memory.  */
 -      YYSTYPE *yyvs1 = yyvs;
 -      yytype_int16 *yyss1 = yyss;]b4_locations_if([
 -      YYLTYPE *yyls1 = yyls;])[
 -
 -      /* Each stack pointer address is followed by the size of the
 -         data in use in that stack, in bytes.  This used to be a
 -         conditional around just the two extra args, but that might
 -         be undefined if yyoverflow is a macro.  */
 -      yyoverflow (YY_("memory exhausted"),
 -                  &yyss1, yysize * sizeof (*yyssp),
 -                  &yyvs1, yysize * sizeof (*yyvsp),]b4_locations_if([
 -                  &yyls1, yysize * sizeof (*yylsp),])[
 -                  &yystacksize);
 +        /* Give user a chance to reallocate the stack.  Use copies of
 +           these so that the &'s don't force the real ones into
 +           memory.  */
 +        YYSTYPE *yyvs1 = yyvs;
 +        yytype_int16 *yyss1 = yyss;]b4_locations_if([
 +        YYLTYPE *yyls1 = yyls;])[
 +
 +        /* Each stack pointer address is followed by the size of the
 +           data in use in that stack, in bytes.  This used to be a
 +           conditional around just the two extra args, but that might
 +           be undefined if yyoverflow is a macro.  */
 +        yyoverflow (YY_("memory exhausted"),
 +                    &yyss1, yysize * sizeof (*yyssp),
 +                    &yyvs1, yysize * sizeof (*yyvsp),]b4_locations_if([
 +                    &yyls1, yysize * sizeof (*yylsp),])[
 +                    &yystacksize);
  ]b4_locations_if([
 -      yyls = yyls1;])[
 -      yyss = yyss1;
 -      yyvs = yyvs1;
 +        yyls = yyls1;])[
 +        yyss = yyss1;
 +        yyvs = yyvs1;
        }
  #else /* no yyoverflow */
  # ifndef YYSTACK_RELOCATE
  # else
        /* Extend the stack our own way.  */
        if (YYMAXDEPTH <= yystacksize)
 -      goto yyexhaustedlab;
 +        goto yyexhaustedlab;
        yystacksize *= 2;
        if (YYMAXDEPTH < yystacksize)
 -      yystacksize = YYMAXDEPTH;
 +        yystacksize = YYMAXDEPTH;
  
        {
 -      yytype_int16 *yyss1 = yyss;
 -      union yyalloc *yyptr =
 -        (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
 -      if (! yyptr)
 -        goto yyexhaustedlab;
 -      YYSTACK_RELOCATE (yyss_alloc, yyss);
 -      YYSTACK_RELOCATE (yyvs_alloc, yyvs);]b4_locations_if([
 -      YYSTACK_RELOCATE (yyls_alloc, yyls);])[
 +        yytype_int16 *yyss1 = yyss;
 +        union yyalloc *yyptr =
 +          (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
 +        if (! yyptr)
 +          goto yyexhaustedlab;
 +        YYSTACK_RELOCATE (yyss_alloc, yyss);
 +        YYSTACK_RELOCATE (yyvs_alloc, yyvs);]b4_locations_if([
 +        YYSTACK_RELOCATE (yyls_alloc, yyls);])[
  #  undef YYSTACK_RELOCATE
 -      if (yyss1 != yyssa)
 -        YYSTACK_FREE (yyss1);
 +        if (yyss1 != yyssa)
 +          YYSTACK_FREE (yyss1);
        }
  # endif
  #endif /* no yyoverflow */
        yylsp = yyls + yysize - 1;])[
  
        YYDPRINTF ((stderr, "Stack size increased to %lu\n",
 -                (unsigned long int) yystacksize));
 +                  (unsigned long int) yystacksize));
  
        if (yyss + yystacksize - 1 <= yyssp)
 -      YYABORT;
 +        YYABORT;
      }
  
    YYDPRINTF ((stderr, "Entering state %d\n", yystate));
@@@ -1731,9 -1837,9 +1728,9 @@@ yyreduce
    goto yynewstate;
  
  
 -/*------------------------------------.
 -| yyerrlab -- here on detecting error |
 -`------------------------------------*/
 +/*--------------------------------------.
 +| yyerrlab -- here on detecting error |
 +`--------------------------------------*/
  yyerrlab:
    /* Make sure we have latest lookahead translation.  See comments at
       user semantic actions for why this is necessary.  */
    if (yyerrstatus == 3)
      {
        /* If just tried and failed to reuse lookahead token after an
 -       error, discard it.  */
 +         error, discard it.  */
  
        if (yychar <= YYEOF)
 -      {
 -        /* Return failure if at end of input.  */
 -        if (yychar == YYEOF)
 -          YYABORT;
 -      }
 +        {
 +          /* Return failure if at end of input.  */
 +          if (yychar == YYEOF)
 +            YYABORT;
 +        }
        else
 -      {
 -        yydestruct ("Error: discarding",
 -                    yytoken, &yylval]b4_locations_if([, &yylloc])[]b4_user_args[);
 -        yychar = YYEMPTY;
 -      }
 +        {
 +          yydestruct ("Error: discarding",
 +                      yytoken, &yylval]b4_locations_if([, &yylloc])[]b4_user_args[);
 +          yychar = YYEMPTY;
 +        }
      }
  
    /* Else will try to reuse lookahead token after shifting the error
@@@ -1833,29 -1939,29 +1830,29 @@@ yyerrorlab
  | yyerrlab1 -- common code for both syntax error and YYERROR.  |
  `-------------------------------------------------------------*/
  yyerrlab1:
 -  yyerrstatus = 3;    /* Each real token shifted decrements this.  */
 +  yyerrstatus = 3;      /* Each real token shifted decrements this.  */
  
    for (;;)
      {
        yyn = yypact[yystate];
        if (!yypact_value_is_default (yyn))
 -      {
 -        yyn += YYTERROR;
 -        if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
 -          {
 -            yyn = yytable[yyn];
 -            if (0 < yyn)
 -              break;
 -          }
 -      }
 +        {
 +          yyn += YYTERROR;
 +          if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
 +            {
 +              yyn = yytable[yyn];
 +              if (0 < yyn)
 +                break;
 +            }
 +        }
  
        /* Pop the current state because it cannot handle the error token.  */
        if (yyssp == yyss)
 -      YYABORT;
 +        YYABORT;
  
  ]b4_locations_if([[      yyerror_range[1] = *yylsp;]])[
        yydestruct ("Error: popping",
 -                yystos[yystate], yyvsp]b4_locations_if([, yylsp])[]b4_user_args[);
 +                  yystos[yystate], yyvsp]b4_locations_if([, yylsp])[]b4_user_args[);
        YYPOPSTACK (1);
        yystate = *yyssp;
        YY_STACK_PRINT (yyss, yyssp);
@@@ -1922,7 -2028,7 +1919,7 @@@ yyreturn
    while (yyssp != yyss)
      {
        yydestruct ("Cleanup: popping",
 -                yystos[*yyssp], yyvsp]b4_locations_if([, yylsp])[]b4_user_args[);
 +                  yystos[*yyssp], yyvsp]b4_locations_if([, yylsp])[]b4_user_args[);
        YYPOPSTACK (1);
      }
  #ifndef yyoverflow
@@@ -1938,14 -2044,19 +1935,15 @@@ yypushreturn:]])
    if (yymsg != yymsgbuf)
      YYSTACK_FREE (yymsg);
  #endif
 -  /* Make sure YYID is used.  */
 -  return YYID (yyresult);
 +  return yyresult;
  }
 -
 -
  ]b4_epilogue[]dnl
+ b4_output_end()
  b4_defines_if(
- [@output(b4_spec_defines_file@)@
- b4_copyright([Bison interface for Yacc-like parsers in C])[
+ [b4_output_begin([b4_spec_defines_file])[
 -]b4_copyright([Bison interface for Yacc-like parsers in C],
 -              [1984, 1989-1990, 2000-2012])[
++]b4_copyright([Bison interface for Yacc-like parsers in C])[
  
  ]b4_shared_declarations[
- ]])dnl b4_defines_if
- m4_divert_pop(0)
- m4_popdef([b4_copyright_years])
+ ]b4_output_end()
 -])
++])# b4_defines_if
diff --combined lib/.gitignore
index e62b99c31b56485a4780d3754d55da6eab5fe10a,15354476e5f604ff5861116b24c9143ba3bf718c..ba37d129a39e3ddcdcb50559cb030dadf013fa77
@@@ -35,8 -35,6 +35,8 @@@
  /close.c
  /closeout.c
  /closeout.h
 +/concat-filename.c
 +/concat-filename.h
  /config.charset
  /config.h
  /config.in.h
@@@ -64,7 -62,6 +64,7 @@@
  /fd-hook.h
  /fd-safer-flag.c
  /fd-safer.c
 +/filename.h
  /float+.h
  /float.c
  /float.h
  /mbchar.c
  /mbchar.h
  /mbrtowc.c
 -/mbschr.c
  /mbsinit.c
 -/mbsrchr.c
  /mbswidth.c
  /mbswidth.h
  /mbuiter.h
  /nonblocking.h
  /obstack.c
  /obstack.h
 +/obstack_printf.c
  /open.c
  /pathmax.h
  /perror.c
  /sys_socket.in.h
  /sys_stat.h
  /sys_stat.in.h
 +/sys_types.in.h
  /sys_wait.h
  /sys_wait.in.h
  /sysexits.in.h
  /xalloc-die.c
  /xalloc-oversized.h
  /xalloc.h
 +/xconcat-filename.c
  /xmalloc.c
 +/xmemdup0.c
 +/xmemdup0.h
  /xsize.h
  /xstrndup.c
  /xstrndup.h
 -/xmemdup0.c
 -/xmemdup0.h
 -/sys_types.in.h
 -/obstack_printf.c
  /binary-io.c
 -/mbuiter.c
  /xsize.c
+ /bitrotate.c
+ /math.c
+ /sig-handler.c
+ /stdio.c
+ /unistd.c
+ /wctype-h.c
diff --combined m4/.gitignore
index 3dfdf6adc8f4e963c4c89dd9b3207710f8f21cc5,7d1124906728546d8b7446d71fe723cc9242e0d4..80193dbb1778cd0db3a88e4f1188ea0eb0aa5201
  /hash.m4
  /iconv.m4
  /include_next.m4
- /inline.m4
  /intdiv0.m4
  /intl.m4
 +/intl.m4~
  /intldir.m4
  /intlmacosx.m4
  /intmax.m4
  /perror.m4
  /pipe2.m4
  /po.m4
 +/po.m4~
  /posix_spawn.m4
  /printf-frexp.m4
  /printf-frexpl.m4
  /xstrndup.m4
  /obstack-printf.m4
  /extern-inline.m4
 +/non-recursive-gnulib-prefix-hack.m4
diff --combined src/location.c
index a749415878e2c1f0708beb54f0a814d5d18c18ba,fa1b53cb5611a81a19319c464e2ab094ced5009a..c27ad1449f3a5983cd5e4e11f58b6922c0128108
@@@ -42,7 -42,7 +42,7 @@@ add_column_width (int column, char cons
    if (buf)
      {
        if (INT_MAX / 2 <= bufsize)
 -      return INT_MAX;
 +        return INT_MAX;
        width = mbsnwidth (buf, bufsize, 0);
      }
    else
@@@ -69,19 -69,19 +69,19 @@@ location_compute (location *loc, bounda
      switch (*p)
        {
        case '\n':
 -      line += line < INT_MAX;
 -      column = 1;
 -      p0 = p + 1;
 -      break;
 +        line += line < INT_MAX;
 +        column = 1;
 +        p0 = p + 1;
 +        break;
  
        case '\t':
 -      column = add_column_width (column, p0, p - p0);
 -      column = add_column_width (column, NULL, 8 - ((column - 1) & 7));
 -      p0 = p + 1;
 -      break;
 +        column = add_column_width (column, p0, p - p0);
 +        column = add_column_width (column, NULL, 8 - ((column - 1) & 7));
 +        p0 = p + 1;
 +        break;
  
        default:
 -      break;
 +        break;
        }
  
    cur->line = line;
@@@ -90,9 -90,9 +90,9 @@@
    loc->end = *cur;
  
    if (line == INT_MAX && loc->start.line != INT_MAX)
 -    warn_at (*loc, _("line number overflow"));
 +    complain (loc, Wother, _("line number overflow"));
    if (column == INT_MAX && loc->start.column != INT_MAX)
 -    warn_at (*loc, _("column number overflow"));
 +    complain (loc, Wother, _("column number overflow"));
  }
  
  
@@@ -107,7 -107,7 +107,7 @@@ location_print (FILE *out, location loc
                    quotearg_n_style (3, escape_quoting_style, loc.start.file));
    if (0 <= loc.start.line)
      {
-       res += fprintf(out, ":%d", loc.start.line);
+       res += fprintf (out, ":%d", loc.start.line);
        if (0 <= loc.start.column)
          res += fprintf (out, ".%d", loc.start.column);
      }
                                          loc.end.file));
        if (0 <= loc.end.line)
          {
-           res += fprintf(out, ":%d", loc.end.line);
+           res += fprintf (out, ":%d", loc.end.line);
            if (0 <= end_col)
              res += fprintf (out, ".%d", end_col);
          }
@@@ -143,11 -143,11 +143,11 @@@ boundary_set_from_string (boundary *bou
  {
    /* Must search in reverse since the file name field may
     * contain `.' or `:'.  */
 -  char *delim = mbsrchr (loc_str, '.');
 +  char *delim = strrchr (loc_str, '.');
    aver (delim);
    *delim = '\0';
    bound->column = atoi (delim+1);
 -  delim = mbsrchr (loc_str, ':');
 +  delim = strrchr (loc_str, ':');
    aver (delim);
    *delim = '\0';
    bound->line = atoi (delim+1);
diff --combined src/scan-gram.l
index f5c9b88f013463dac4f9931c55531333e86aca3c,5e78cb9b7ade7994980e04af7fd687fc34e05844..e6f42ea934c57a539f659d869100855821032739
@@@ -17,7 -17,7 +17,7 @@@
     You should have received a copy of the GNU General Public License
     along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
  
 -%option debug nodefault noinput nounput noyywrap never-interactive
 +%option debug nodefault noinput noyywrap never-interactive
  %option prefix="gram_" outfile="lex.yy.c"
  
  %{
  #define gram_wrap() 1
  
  #define FLEX_PREFIX(Id) gram_ ## Id
 -#include "flex-scanner.h"
 +#include <src/flex-scanner.h>
  
 -#include "complain.h"
 -#include "files.h"
 -#include "gram.h"
 -#include "quotearg.h"
 -#include "reader.h"
 -#include "uniqstr.h"
 +#include <src/complain.h>
 +#include <src/files.h>
 +#include <src/getargs.h>
 +#include <src/gram.h>
 +#include <quotearg.h>
 +#include <src/reader.h>
 +#include <src/uniqstr.h>
  
  #include <c-ctype.h>
  #include <mbswidth.h>
  #include <quote.h>
  
 -#include "scan-gram.h"
 +#include <src/scan-gram.h>
  
  #define YY_DECL GRAM_LEX_DECL
  
 -#define YY_USER_INIT                                  \
 -   code_start = scanner_cursor = loc->start;          \
 +#define YY_USER_INIT                                    \
 +   code_start = scanner_cursor = loc->start;            \
  
  /* Location of scanner cursor.  */
  static boundary scanner_cursor;
  static size_t no_cr_read (FILE *, char *, size_t);
  #define YY_INPUT(buf, result, size) ((result) = no_cr_read (yyin, buf, size))
  
 +#define RETURN_PERCENT_PARAM(Value)                     \
 +  RETURN_VALUE(PERCENT_PARAM, param, param_ ## Value)
 +
 +#define RETURN_PERCENT_FLAG(Value)                              \
 +  RETURN_VALUE(PERCENT_FLAG, uniqstr, uniqstr_new (Value))
 +
 +#define RETURN_VALUE(Token, Field, Value)       \
 +  do {                                          \
 +    val->Field = Value;                         \
 +    return Token;                               \
 +  } while (0)
 +
  #define ROLLBACK_CURRENT_TOKEN                                  \
    do {                                                          \
 -    scanner_cursor.column -= mbsnwidth (yytext, yyleng, 0);   \
 +    scanner_cursor.column -= mbsnwidth (yytext, yyleng, 0);     \
      yyless (0);                                                 \
    } while (0)
  
 +#define DEPRECATED(Msg)                                         \
 +  do {                                                          \
 +    size_t i;                                                   \
 +    complain (loc, Wdeprecated,                                 \
 +              _("deprecated directive: %s, use %s"),            \
 +              quote (yytext), quote_n (1, Msg));                \
 +    scanner_cursor.column -= mbsnwidth (Msg, strlen (Msg), 0);  \
 +    for (i = strlen (Msg); i != 0; --i)                         \
 +      unput (Msg[i - 1]);                                       \
 +  } while (0)
 +
  /* A string representing the most recently saved token.  */
  static char *last_string;
  
@@@ -114,15 -90,12 +114,15 @@@ static void unexpected_newline (boundar
   /* A identifier was just read in directives/rules.  Special state
      to capture the sequence 'identifier :'. */
  %x SC_AFTER_IDENTIFIER
 + /* A complex tag, with nested angles brackets. */
 +%x SC_TAG
  
 - /* Three types of user code:
 + /* Four types of user code:
      - prologue (code between '%{' '%}' in the first section, before %%);
      - actions, printers, union, etc, (between braced in the middle section);
 -    - epilogue (everything after the second %%). */
 -%x SC_PROLOGUE SC_BRACED_CODE SC_EPILOGUE
 +    - epilogue (everything after the second %%).
 +    - predicate (code between '%?{' and '{' in middle section); */
 +%x SC_PROLOGUE SC_BRACED_CODE SC_EPILOGUE SC_PREDICATE
   /* C and C++ comments in code. */
  %x SC_COMMENT SC_LINE_COMMENT
   /* Strings and characters in code. */
   /* Bracketed identifiers support. */
  %x SC_BRACKETED_ID SC_RETURN_BRACKETED_ID
  
 -letter           [.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_]
 +letter    [.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_]
  notletter [^.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_]{-}[%\{]
 -id      {letter}({letter}|[-0-9])*
 -int     [0-9]+
 +id        {letter}({letter}|[-0-9])*
 +int       [0-9]+
  
  /* POSIX says that a tag must be both an id and a C union member, but
     historically almost any character is allowed in a tag.  We disallow
 -   NUL and newline, as this simplifies our implementation.  */
 -tag    [^\0\n>]+
 +   NUL, as this simplifies our implementation.  We disallow angle
 +   bracket to match them in nested pairs: several languages use them
 +   for generics/template types.  */
 +tag      [^\0<>]+
  
  /* Zero or more instances of backslash-newline.  Following GCC, allow
     white space between the backslash and the newline.  */
 -splice         (\\[ \f\t\v]*\n)*
 +splice   (\\[ \f\t\v]*\n)*
 +
 +/* An equal sign, with optional leading whitespaces. This is used in some
 +   deprecated constructs. */
 +eqopt    ([[:space:]]*=)?
  
  %%
  %{
 -  /* Nesting level of the current code in braces.  */
 -  int braces_level PACIFY_CC (= 0);
 +  /* Nesting level.  Either for nested braces, or nested angle brackets
 +     (but not mixed).  */
 +  int nesting PACIFY_CC (= 0);
  
    /* Parent context state, when applicable.  */
    int context_state PACIFY_CC (= 0);
  <INITIAL,SC_AFTER_IDENTIFIER,SC_BRACKETED_ID,SC_RETURN_BRACKETED_ID>
  {
    /* Comments and white space.  */
 -  ","          warn_at (*loc, _("stray ',' treated as white space"));
 +  "," {
 +     complain (loc, Wother, _("stray ',' treated as white space"));
 +  }
    [ \f\n\t\v]  |
    "//".*       continue;
    "/*" {
  
    /* #line directives are not documented, and may be withdrawn or
       modified in future versions of Bison.  */
-   ^"#line "{int}" \"".*"\"\n" {
+   ^"#line "{int}(" \"".*"\"")?"\n" {
      handle_syncline (yytext + sizeof "#line " - 1, *loc);
    }
  }
    `----------------------------*/
  
    /* For directives that are also command line options, the regex must be
 -      "%..."
 +        "%..."
       after "[-_]"s are removed, and the directive must match the --long
       option name, with a single string argument.  Otherwise, add exceptions
       to ../build-aux/cross-options.pl.  */
  {
    "%binary"                         return PERCENT_NONASSOC;
    "%code"                           return PERCENT_CODE;
 -  "%debug"                          return PERCENT_DEBUG;
 -  "%default"[-_]"prec"              return PERCENT_DEFAULT_PREC;
 +  "%debug"                          RETURN_PERCENT_FLAG("parse.trace");
 +  "%default-prec"                   return PERCENT_DEFAULT_PREC;
    "%define"                         return PERCENT_DEFINE;
    "%defines"                        return PERCENT_DEFINES;
    "%destructor"                     return PERCENT_DESTRUCTOR;
    "%dprec"                          return PERCENT_DPREC;
 -  "%error"[-_]"verbose"             return PERCENT_ERROR_VERBOSE;
 +  "%error-verbose"                  return PERCENT_ERROR_VERBOSE;
    "%expect"                         return PERCENT_EXPECT;
 -  "%expect"[-_]"rr"                 return PERCENT_EXPECT_RR;
 +  "%expect-rr"                      return PERCENT_EXPECT_RR;
    "%file-prefix"                    return PERCENT_FILE_PREFIX;
 -  "%fixed"[-_]"output"[-_]"files"   return PERCENT_YACC;
 +  "%fixed-output-files"             return PERCENT_YACC;
    "%initial-action"                 return PERCENT_INITIAL_ACTION;
    "%glr-parser"                     return PERCENT_GLR_PARSER;
    "%language"                       return PERCENT_LANGUAGE;
    "%left"                           return PERCENT_LEFT;
 -  "%lex-param"                      return PERCENT_LEX_PARAM;
 -  "%locations"                      return PERCENT_LOCATIONS;
 +  "%lex-param"                      RETURN_PERCENT_PARAM(lex);
 +  "%locations"                      RETURN_PERCENT_FLAG("locations");
    "%merge"                          return PERCENT_MERGE;
 -  "%name"[-_]"prefix"               return PERCENT_NAME_PREFIX;
 -  "%no"[-_]"default"[-_]"prec"      return PERCENT_NO_DEFAULT_PREC;
 -  "%no"[-_]"lines"                  return PERCENT_NO_LINES;
 +  "%name-prefix"                    return PERCENT_NAME_PREFIX;
 +  "%no-default-prec"                return PERCENT_NO_DEFAULT_PREC;
 +  "%no-lines"                       return PERCENT_NO_LINES;
    "%nonassoc"                       return PERCENT_NONASSOC;
    "%nondeterministic-parser"        return PERCENT_NONDETERMINISTIC_PARSER;
    "%nterm"                          return PERCENT_NTERM;
    "%output"                         return PERCENT_OUTPUT;
 -  "%parse-param"                    return PERCENT_PARSE_PARAM;
 +  "%param"                          RETURN_PERCENT_PARAM(both);
 +  "%parse-param"                    RETURN_PERCENT_PARAM(parse);
    "%prec"                           return PERCENT_PREC;
 +  "%precedence"                     return PERCENT_PRECEDENCE;
    "%printer"                        return PERCENT_PRINTER;
 -  "%pure"[-_]"parser"               return PERCENT_PURE_PARSER;
 +  "%pure-parser"                    RETURN_PERCENT_FLAG("api.pure");
    "%require"                        return PERCENT_REQUIRE;
    "%right"                          return PERCENT_RIGHT;
    "%skeleton"                       return PERCENT_SKELETON;
    "%start"                          return PERCENT_START;
    "%term"                           return PERCENT_TOKEN;
    "%token"                          return PERCENT_TOKEN;
 -  "%token"[-_]"table"               return PERCENT_TOKEN_TABLE;
 +  "%token-table"                    return PERCENT_TOKEN_TABLE;
    "%type"                           return PERCENT_TYPE;
    "%union"                          return PERCENT_UNION;
    "%verbose"                        return PERCENT_VERBOSE;
    "%yacc"                           return PERCENT_YACC;
  
 +  /* deprecated */
 +  "%default"[-_]"prec"              DEPRECATED("%default-prec");
 +  "%error"[-_]"verbose"             DEPRECATED("%define parse.error verbose");
 +  "%expect"[-_]"rr"                 DEPRECATED("%expect-rr");
 +  "%file-prefix"{eqopt}             DEPRECATED("%file-prefix");
 +  "%fixed"[-_]"output"[-_]"files"   DEPRECATED("%fixed-output-files");
 +  "%name"[-_]"prefix"{eqopt}        DEPRECATED("%name-prefix");
 +  "%no"[-_]"default"[-_]"prec"      DEPRECATED("%no-default-prec");
 +  "%no"[-_]"lines"                  DEPRECATED("%no-lines");
 +  "%output"{eqopt}                  DEPRECATED("%output");
 +  "%pure"[-_]"parser"               DEPRECATED("%pure-parser");
 +  "%token"[-_]"table"               DEPRECATED("%token-table");
 +
    "%"{id}|"%"{notletter}([[:graph:]])+ {
 -    complain_at (*loc, _("invalid directive: %s"), quote (yytext));
 +    complain (loc, complaint, _("invalid directive: %s"), quote (yytext));
    }
  
    "="                     return EQUAL;
    "|"                     return PIPE;
    ";"                     return SEMICOLON;
 -  "<*>"                   return TYPE_TAG_ANY;
 -  "<>"                    return TYPE_TAG_NONE;
  
    {id} {
      val->uniqstr = uniqstr_new (yytext);
    /* Identifiers may not start with a digit.  Yet, don't silently
       accept "1FOO" as "1 FOO".  */
    {int}{id} {
 -    complain_at (*loc, _("invalid identifier: %s"), quote (yytext));
 +    complain (loc, complaint, _("invalid identifier: %s"), quote (yytext));
    }
  
    /* Characters.  */
 -  "'"       token_start = loc->start; BEGIN SC_ESCAPED_CHARACTER;
 +  "'"         token_start = loc->start; BEGIN SC_ESCAPED_CHARACTER;
  
    /* Strings. */
 -  "\""              token_start = loc->start; BEGIN SC_ESCAPED_STRING;
 +  "\""        token_start = loc->start; BEGIN SC_ESCAPED_STRING;
  
    /* Prologue. */
    "%{"        code_start = loc->start; BEGIN SC_PROLOGUE;
    /* Code in between braces.  */
    "{" {
      STRING_GROW;
 -    braces_level = 0;
 +    nesting = 0;
      code_start = loc->start;
      BEGIN SC_BRACED_CODE;
    }
  
 +  /* Semantic predicate. */
 +  "%?"[ \f\n\t\v]*"{" {
 +    nesting = 0;
 +    code_start = loc->start;
 +    BEGIN SC_PREDICATE;
 +  }
 +
    /* A type. */
 +  "<*>"       return TAG_ANY;
 +  "<>"        return TAG_NONE;
    "<"{tag}">" {
      obstack_grow (&obstack_for_string, yytext + 1, yyleng - 2);
      STRING_FINISH;
      val->uniqstr = uniqstr_new (last_string);
      STRING_FREE;
 -    return TYPE;
 +    return TAG;
 +  }
 +  "<"         {
 +    nesting = 0;
 +    token_start = loc->start;
 +    BEGIN SC_TAG;
    }
  
    "%%" {
    }
  
    [^\[%A-Za-z0-9_<>{}\"\'*;|=/, \f\n\t\v]+|. {
 -    complain_at (*loc, "%s: %s",
 -                 ngettext ("invalid character", "invalid characters", yyleng),
 -                 quote_mem (yytext, yyleng));
 +    complain (loc, complaint, "%s: %s",
 +              ngettext ("invalid character", "invalid characters", yyleng),
 +              quote_mem (yytext, yyleng));
    }
  
    <<EOF>> {
  }
  
  
 +  /*--------------------------------------------------------------.
 +  | Supporting \0 complexifies our implementation for no expected |
 +  | added value.                                                  |
 +  `--------------------------------------------------------------*/
 +
 +<SC_ESCAPED_CHARACTER,SC_ESCAPED_STRING,SC_TAG>
 +{
 +  \0        complain (loc, complaint, _("invalid null character"));
 +}
 +
 +
    /*-----------------------------------------------------------------.
    | Scanning after an identifier, checking whether a colon is next.  |
    `-----------------------------------------------------------------*/
    "[" {
      if (bracketed_id_str)
        {
 -      ROLLBACK_CURRENT_TOKEN;
 -      BEGIN SC_RETURN_BRACKETED_ID;
 -      *loc = id_loc;
 -      return ID;
 +        ROLLBACK_CURRENT_TOKEN;
 +        BEGIN SC_RETURN_BRACKETED_ID;
 +        *loc = id_loc;
 +        return ID;
        }
      else
        {
 -      bracketed_id_start = loc->start;
 -      bracketed_id_context_state = YY_START;
 -      BEGIN SC_BRACKETED_ID;
 +        bracketed_id_start = loc->start;
 +        bracketed_id_context_state = YY_START;
 +        BEGIN SC_BRACKETED_ID;
        }
    }
    ":" {
    {id} {
      if (bracketed_id_str)
        {
 -      complain_at (*loc, _("unexpected identifier in bracketed name: %s"),
 -                   quote (yytext));
 +        complain (loc, complaint,
 +                  _("unexpected identifier in bracketed name: %s"),
 +                  quote (yytext));
        }
      else
        {
 -      bracketed_id_str = uniqstr_new (yytext);
 -      bracketed_id_loc = *loc;
 +        bracketed_id_str = uniqstr_new (yytext);
 +        bracketed_id_loc = *loc;
        }
    }
    "]" {
      BEGIN bracketed_id_context_state;
      if (bracketed_id_str)
        {
 -      if (INITIAL == bracketed_id_context_state)
 -        {
 -          val->uniqstr = bracketed_id_str;
 -          bracketed_id_str = 0;
 -          *loc = bracketed_id_loc;
 -          return BRACKETED_ID;
 -        }
 +        if (INITIAL == bracketed_id_context_state)
 +          {
 +            val->uniqstr = bracketed_id_str;
 +            bracketed_id_str = 0;
 +            *loc = bracketed_id_loc;
 +            return BRACKETED_ID;
 +          }
        }
      else
 -      complain_at (*loc, _("an identifier expected"));
 +      complain (loc, complaint, _("an identifier expected"));
    }
  
    [^\].A-Za-z0-9_/ \f\n\t\v]+|. {
 -    complain_at (*loc, "%s: %s",
 -                 ngettext ("invalid character in bracketed name",
 -                           "invalid characters in bracketed name", yyleng),
 -                 quote_mem (yytext, yyleng));
 +    complain (loc, complaint, "%s: %s",
 +              ngettext ("invalid character in bracketed name",
 +                        "invalid characters in bracketed name", yyleng),
 +              quote_mem (yytext, yyleng));
    }
  
    <<EOF>> {
  <SC_YACC_COMMENT>
  {
    "*/"     BEGIN context_state;
 -  .|\n           continue;
 +  .|\n     continue;
    <<EOF>>  unexpected_eof (token_start, "*/"); BEGIN context_state;
  }
  
  <SC_COMMENT>
  {
    "*"{splice}"/"  STRING_GROW; BEGIN context_state;
 -  <<EOF>>       unexpected_eof (token_start, "*/"); BEGIN context_state;
 +  <<EOF>>         unexpected_eof (token_start, "*/"); BEGIN context_state;
  }
  
  
  
  <SC_LINE_COMMENT>
  {
 -  "\n"                 STRING_GROW; BEGIN context_state;
 -  {splice}     STRING_GROW;
 -  <<EOF>>      BEGIN context_state;
 +  "\n"           STRING_GROW; BEGIN context_state;
 +  {splice}       STRING_GROW;
 +  <<EOF>>        BEGIN context_state;
  }
  
  
  
    /*----------------------------------------------------------.
    | Scanning a Bison character literal, decoding its escapes. |
 -  | The initial quote is already eaten.                             |
 +  | The initial quote is already eaten.                       |
    `----------------------------------------------------------*/
  
  <SC_ESCAPED_CHARACTER>
        /* FIXME: Eventually, make these errors.  */
        if (last_string[0] == '\0')
          {
 -          warn_at (*loc, _("empty character literal"));
 +          complain (loc, Wother, _("empty character literal"));
            /* '\0' seems dangerous even if we are about to complain.  */
            val->character = '\'';
          }
        else if (last_string[1] != '\0')
 -        warn_at (*loc, _("extra characters in character literal"));
 +        complain (loc, Wother,
 +                  _("extra characters in character literal"));
      }
      if (yytext[0] == '\n')
        unexpected_newline (token_start, "'");
        /* FIXME: Eventually, make these errors.  */
        if (last_string[0] == '\0')
          {
 -          warn_at (*loc, _("empty character literal"));
 +          complain (loc, Wother, _("empty character literal"));
            /* '\0' seems dangerous even if we are about to complain.  */
            val->character = '\'';
          }
        else if (last_string[1] != '\0')
 -        warn_at (*loc, _("extra characters in character literal"));
 +        complain (loc, Wother,
 +                  _("extra characters in character literal"));
      }
      unexpected_eof (token_start, "'");
      STRING_FREE;
    }
  }
  
 -<SC_ESCAPED_CHARACTER,SC_ESCAPED_STRING>
 +  /*-----------------------------------------------------------.
 +  | Scanning a Bison nested tag.  The initial angle bracket is |
 +  | already eaten.                                             |
 +  `-----------------------------------------------------------*/
 +
 +<SC_TAG>
  {
 -  \0      complain_at (*loc, _("invalid null character"));
 -}
 +  ">" {
 +    --nesting;
 +    if (nesting < 0)
 +      {
 +        STRING_FINISH;
 +        loc->start = token_start;
 +        val->uniqstr = uniqstr_new (last_string);
 +        STRING_FREE;
 +        BEGIN INITIAL;
 +        return TAG;
 +      }
 +    STRING_GROW;
 +  }
  
 +  [^<>]+ STRING_GROW;
 +  "<"+   STRING_GROW; nesting += yyleng;
 +
 +  <<EOF>> {
 +    unexpected_eof (token_start, ">");
 +    STRING_FINISH;
 +    loc->start = token_start;
 +    val->uniqstr = uniqstr_new (last_string);
 +    STRING_FREE;
 +    BEGIN INITIAL;
 +    return TAG;
 +  }
 +}
  
    /*----------------------------.
    | Decode escaped characters.  |
    \\[0-7]{1,3} {
      unsigned long int c = strtoul (yytext + 1, NULL, 8);
      if (!c || UCHAR_MAX < c)
 -      complain_at (*loc, _("invalid number after \\-escape: %s"),
 +      complain (loc, complaint, _("invalid number after \\-escape: %s"),
                     yytext+1);
      else
        obstack_1grow (&obstack_for_string, c);
      verify (UCHAR_MAX < ULONG_MAX);
      unsigned long int c = strtoul (yytext + 2, NULL, 16);
      if (!c || UCHAR_MAX < c)
 -      complain_at (*loc, _("invalid number after \\-escape: %s"),
 +      complain (loc, complaint, _("invalid number after \\-escape: %s"),
                     yytext+1);
      else
        obstack_1grow (&obstack_for_string, c);
    }
  
 -  \\a obstack_1grow (&obstack_for_string, '\a');
 -  \\b obstack_1grow (&obstack_for_string, '\b');
 -  \\f obstack_1grow (&obstack_for_string, '\f');
 -  \\n obstack_1grow (&obstack_for_string, '\n');
 -  \\r obstack_1grow (&obstack_for_string, '\r');
 -  \\t obstack_1grow (&obstack_for_string, '\t');
 -  \\v obstack_1grow (&obstack_for_string, '\v');
 +  \\a   obstack_1grow (&obstack_for_string, '\a');
 +  \\b   obstack_1grow (&obstack_for_string, '\b');
 +  \\f   obstack_1grow (&obstack_for_string, '\f');
 +  \\n   obstack_1grow (&obstack_for_string, '\n');
 +  \\r   obstack_1grow (&obstack_for_string, '\r');
 +  \\t   obstack_1grow (&obstack_for_string, '\t');
 +  \\v   obstack_1grow (&obstack_for_string, '\v');
  
    /* \\[\"\'?\\] would be shorter, but it confuses xgettext.  */
    \\("\""|"'"|"?"|"\\")  obstack_1grow (&obstack_for_string, yytext[1]);
    \\(u|U[0-9abcdefABCDEF]{4})[0-9abcdefABCDEF]{4} {
      int c = convert_ucn_to_byte (yytext);
      if (c <= 0)
 -      complain_at (*loc, _("invalid number after \\-escape: %s"),
 +      complain (loc, complaint, _("invalid number after \\-escape: %s"),
                     yytext+1);
      else
        obstack_1grow (&obstack_for_string, c);
    }
 -  \\(.|\n)    {
 +  \\(.|\n)      {
      char const *p = yytext + 1;
      /* Quote only if escaping won't make the character visible.  */
      if (c_isspace ((unsigned char) *p) && c_isprint ((unsigned char) *p))
        p = quote (p);
      else
        p = quotearg_style_mem (escape_quoting_style, p, 1);
 -    complain_at (*loc, _("invalid character after \\-escape: %s"), p);
 +    complain (loc, complaint, _("invalid character after \\-escape: %s"),
 +                 p);
    }
  }
  
  
  <SC_CHARACTER,SC_STRING>
  {
 -  {splice}|\\{splice}[^\n\[\]]        STRING_GROW;
 +  {splice}|\\{splice}[^\n\[\]]  STRING_GROW;
  }
  
  <SC_CHARACTER>
  {
 -  "'"         STRING_GROW; BEGIN context_state;
 -  \n          unexpected_newline (token_start, "'"); BEGIN context_state;
 -  <<EOF>>     unexpected_eof (token_start, "'"); BEGIN context_state;
 +  "'"           STRING_GROW; BEGIN context_state;
 +  \n            unexpected_newline (token_start, "'"); BEGIN context_state;
 +  <<EOF>>       unexpected_eof (token_start, "'"); BEGIN context_state;
  }
  
  <SC_STRING>
  {
 -  "\""                STRING_GROW; BEGIN context_state;
 -  \n          unexpected_newline (token_start, "\""); BEGIN context_state;
 -  <<EOF>>     unexpected_eof (token_start, "\""); BEGIN context_state;
 +  "\""          STRING_GROW; BEGIN context_state;
 +  \n            unexpected_newline (token_start, "\""); BEGIN context_state;
 +  <<EOF>>       unexpected_eof (token_start, "\""); BEGIN context_state;
  }
  
  
    | Strings, comments etc. can be found in user code.  |
    `---------------------------------------------------*/
  
 -<SC_BRACED_CODE,SC_PROLOGUE,SC_EPILOGUE>
 +<SC_BRACED_CODE,SC_PROLOGUE,SC_EPILOGUE,SC_PREDICATE>
  {
    "'" {
      STRING_GROW;
  
  
    /*-----------------------------------------------------------.
 -  | Scanning some code in braces (actions). The initial "{" is |
 -  | already eaten.                                             |
 +  | Scanning some code in braces (actions, predicates). The    |
 +  | initial "{" is already eaten.                              |
    `-----------------------------------------------------------*/
  
 -<SC_BRACED_CODE>
 +<SC_BRACED_CODE,SC_PREDICATE>
  {
 -  "{"|"<"{splice}"%"  STRING_GROW; braces_level++;
 -  "%"{splice}">"      STRING_GROW; braces_level--;
 -  "}" {
 -    obstack_1grow (&obstack_for_string, '}');
 -
 -    --braces_level;
 -    if (braces_level < 0)
 -      {
 -      STRING_FINISH;
 -      loc->start = code_start;
 -      val->code = last_string;
 -      BEGIN INITIAL;
 -      return BRACED_CODE;
 -      }
 -  }
 +  "{"|"<"{splice}"%"  STRING_GROW; nesting++;
 +  "%"{splice}">"      STRING_GROW; nesting--;
  
    /* Tokenize '<<%' correctly (as '<<' '%') rather than incorrrectly
       (as '<' '<%').  */
    "<"{splice}"<"  STRING_GROW;
  
    <<EOF>> {
 +    int token = (YY_START == SC_BRACED_CODE) ? BRACED_CODE : BRACED_PREDICATE;
      unexpected_eof (code_start, "}");
      STRING_FINISH;
      loc->start = code_start;
      val->code = last_string;
      BEGIN INITIAL;
 -    return BRACED_CODE;
 +    return token;
    }
  }
  
 +<SC_BRACED_CODE>
 +{
 +  "}" {
 +    obstack_1grow (&obstack_for_string, '}');
 +
 +    --nesting;
 +    if (nesting < 0)
 +      {
 +        STRING_FINISH;
 +        loc->start = code_start;
 +        val->code = last_string;
 +        BEGIN INITIAL;
 +        return BRACED_CODE;
 +      }
 +  }
 +}
 +
 +<SC_PREDICATE>
 +{
 +  "}" {
 +    --nesting;
 +    if (nesting < 0)
 +      {
 +        STRING_FINISH;
 +        loc->start = code_start;
 +        val->code = last_string;
 +        BEGIN INITIAL;
 +        return BRACED_PREDICATE;
 +      }
 +    else
 +      obstack_1grow (&obstack_for_string, '}');
 +  }
 +}
  
    /*--------------------------------------------------------------.
    | Scanning some prologue: from "%{" (already scanned) to "%}".  |
    | By default, grow the string obstack with the input.  |
    `-----------------------------------------------------*/
  
 -<SC_COMMENT,SC_LINE_COMMENT,SC_BRACED_CODE,SC_PROLOGUE,SC_EPILOGUE,SC_STRING,SC_CHARACTER,SC_ESCAPED_STRING,SC_ESCAPED_CHARACTER>.    |
 -<SC_COMMENT,SC_LINE_COMMENT,SC_BRACED_CODE,SC_PROLOGUE,SC_EPILOGUE>\n STRING_GROW;
 +<SC_COMMENT,SC_LINE_COMMENT,SC_BRACED_CODE,SC_PREDICATE,SC_PROLOGUE,SC_EPILOGUE,SC_STRING,SC_CHARACTER,SC_ESCAPED_STRING,SC_ESCAPED_CHARACTER>. |
 +  <SC_COMMENT,SC_LINE_COMMENT,SC_BRACED_CODE,SC_PREDICATE,SC_PROLOGUE,SC_EPILOGUE>\n    STRING_GROW;
  
  %%
  
@@@ -860,35 -732,35 +860,35 @@@ no_cr_read (FILE *fp, char *buf, size_
      {
        char *w = memchr (buf, '\r', bytes_read);
        if (w)
 -      {
 -        char const *r = ++w;
 -        char const *lim = buf + bytes_read;
 -
 -        for (;;)
 -          {
 -            /* Found an '\r'.  Treat it like '\n', but ignore any
 -               '\n' that immediately follows.  */
 -            w[-1] = '\n';
 -            if (r == lim)
 -              {
 -                int ch = getc (fp);
 -                if (ch != '\n' && ungetc (ch, fp) != ch)
 -                  break;
 -              }
 -            else if (*r == '\n')
 -              r++;
 -
 -            /* Copy until the next '\r'.  */
 -            do
 -              {
 -                if (r == lim)
 -                  return w - buf;
 -              }
 -            while ((*w++ = *r++) != '\r');
 -          }
 -
 -        return w - buf;
 -      }
 +        {
 +          char const *r = ++w;
 +          char const *lim = buf + bytes_read;
 +
 +          for (;;)
 +            {
 +              /* Found an '\r'.  Treat it like '\n', but ignore any
 +                 '\n' that immediately follows.  */
 +              w[-1] = '\n';
 +              if (r == lim)
 +                {
 +                  int ch = getc (fp);
 +                  if (ch != '\n' && ungetc (ch, fp) != ch)
 +                    break;
 +                }
 +              else if (*r == '\n')
 +                r++;
 +
 +              /* Copy until the next '\r'.  */
 +              do
 +                {
 +                  if (r == lim)
 +                    return w - buf;
 +                }
 +              while ((*w++ = *r++) != '\r');
 +            }
 +
 +          return w - buf;
 +        }
      }
  
    return bytes_read;
@@@ -908,8 -780,7 +908,8 @@@ scan_integer (char const *number, int b
  
    if (INT_MAX < num)
      {
 -      complain_at (loc, _("integer out of range: %s"), quote (number));
 +      complain (&loc, complaint, _("integer out of range: %s"),
 +                   quote (number));
        num = INT_MAX;
      }
  
  /*------------------------------------------------------------------.
  | Convert universal character name UCN to a single-byte character,  |
  | and return that character.  Return -1 if UCN does not correspond  |
 -| to a single-byte character.                                     |
 +| to a single-byte character.                                       |
  `------------------------------------------------------------------*/
  
  static int
@@@ -948,22 -819,22 +948,22 @@@ convert_ucn_to_byte (char const *ucn
         about.  */
      static signed char const table[] =
        {
 -      '\0',   -1,   -1,   -1,   -1,   -1,   -1, '\a',
 -      '\b', '\t', '\n', '\v', '\f', '\r',   -1,   -1,
 -        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
 -        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
 -       ' ',  '!',  '"',  '#',  '$',  '%',  '&', '\'',
 -       '(',  ')',  '*',  '+',  ',',  '-',  '.',  '/',
 -       '0',  '1',  '2',  '3',  '4',  '5',  '6',  '7',
 -       '8',  '9',  ':',  ';',  '<',  '=',  '>',  '?',
 -       '@',  'A',  'B',  'C',  'D',  'E',  'F',  'G',
 -       'H',  'I',  'J',  'K',  'L',  'M',  'N',  'O',
 -       'P',  'Q',  'R',  'S',  'T',  'U',  'V',  'W',
 -       'X',  'Y',  'Z',  '[', '\\',  ']',  '^',  '_',
 -       '`',  'a',  'b',  'c',  'd',  'e',  'f',  'g',
 -       'h',  'i',  'j',  'k',  'l',  'm',  'n',  'o',
 -       'p',  'q',  'r',  's',  't',  'u',  'v',  'w',
 -       'x',  'y',  'z',  '{',  '|',  '}',  '~'
 +        '\0',   -1,   -1,   -1,   -1,   -1,   -1, '\a',
 +        '\b', '\t', '\n', '\v', '\f', '\r',   -1,   -1,
 +          -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
 +          -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
 +         ' ',  '!',  '"',  '#',  '$',  '%',  '&', '\'',
 +         '(',  ')',  '*',  '+',  ',',  '-',  '.',  '/',
 +         '0',  '1',  '2',  '3',  '4',  '5',  '6',  '7',
 +         '8',  '9',  ':',  ';',  '<',  '=',  '>',  '?',
 +         '@',  'A',  'B',  'C',  'D',  'E',  'F',  'G',
 +         'H',  'I',  'J',  'K',  'L',  'M',  'N',  'O',
 +         'P',  'Q',  'R',  'S',  'T',  'U',  'V',  'W',
 +         'X',  'Y',  'Z',  '[', '\\',  ']',  '^',  '_',
 +         '`',  'a',  'b',  'c',  'd',  'e',  'f',  'g',
 +         'h',  'i',  'j',  'k',  'l',  'm',  'n',  'o',
 +         'p',  'q',  'r',  's',  't',  'u',  'v',  'w',
 +         'x',  'y',  'z',  '{',  '|',  '}',  '~'
        };
  
      code = code < sizeof table ? table[code] : -1;
  }
  
  
- /*----------------------------------------------------------------.
- | Handle '#line INT "FILE"'.  ARGS has already skipped '#line '.  |
- `----------------------------------------------------------------*/
+ /*---------------------------------------------------------------------.
+ | Handle '#line INT( "FILE")?\n'.  ARGS has already skipped '#line '.  |
+ `---------------------------------------------------------------------*/
  
  static void
  handle_syncline (char *args, location loc)
  {
-   char *after_num;
-   unsigned long int lineno = strtoul (args, &after_num, 10);
-   char *file = strchr (after_num, '"') + 1;
-   *strchr (file, '"') = '\0';
+   char *file;
+   unsigned long int lineno = strtoul (args, &file, 10);
    if (INT_MAX <= lineno)
      {
 -      warn_at (loc, _("line number overflow"));
 +      complain (&loc, Wother, _("line number overflow"));
        lineno = INT_MAX;
      }
-   current_file = uniqstr_new (file);
 -  file = mbschr (file, '"');
++  file = strchr (file, '"');
+   if (file)
+     {
 -      *mbschr (file + 1, '"') = '\0';
++      *strchr (file + 1, '"') = '\0';
+       current_file = uniqstr_new (file + 1);
+     }
    boundary_set (&scanner_cursor, current_file, lineno, 1);
  }
  
  
  /*----------------------------------------------------------------.
  | For a token or comment starting at START, report message MSGID, |
 -| which should say that an end marker was found before                  |
 -| the expected TOKEN_END.                                       |
 +| which should say that an end marker was found before            |
 +| the expected TOKEN_END.                                         |
  `----------------------------------------------------------------*/
  
  static void
@@@ -1009,9 -884,9 +1013,9 @@@ unexpected_end (boundary start, char co
    loc.end = scanner_cursor;
    token_end = quote (token_end);
    // Instead of '\'', display "'".
 -  if (!strcmp (token_end, "'\\''"))
 +  if (STREQ (token_end, "'\\''"))
      token_end = "\"'\"";
 -  complain_at (loc, _(msgid), token_end);
 +  complain (&loc, complaint, _(msgid), token_end);
  }
  
  
diff --combined tests/actions.at
index 8278293dfcac0e64d16d27dae5d58086b28b8ee8,17e6085b21dcf25aa827abe03ad456a07771c65e..c148391d731435cfef9af6fbed189e3a7a601871
@@@ -1,4 -1,4 +1,4 @@@
 -# Executing Actions.                               -*- Autotest -*-
 +e# Executing Actions.                               -*- Autotest -*-
  
  # Copyright (C) 2001-2012 Free Software Foundation, Inc.
  
@@@ -30,7 -30,7 +30,7 @@@ AT_SETUP([Mid-rule actions]
  
  AT_BISON_OPTION_PUSHDEFS
  AT_DATA_GRAMMAR([[input.y]],
 -[[%error-verbose
 +[[%define parse.error verbose
  %debug
  %{
  ]AT_YYERROR_DECLARE[
@@@ -174,6 -174,81 +174,81 @@@ m4_popdef([AT_TEST]
  
  
  
+ ## ---------------- ##
+ ## Location Print.  ##
+ ## ---------------- ##
+ # AT_TEST(SKELETON-NAME, DIRECTIVES, [MORE-DIRECTIVES], [LOCATION = 1.1])
+ # -----------------------------------------------------------------------
+ # Check that the initial location is correct.
+ m4_pushdef([AT_TEST],
+ [AT_SETUP([Location print: $1 $2])
+ AT_BISON_OPTION_PUSHDEFS([%locations %skeleton "$1" $2])
+ AT_DATA_GRAMMAR([[input.y]],
+ [[%defines /* FIXME: Required by lalr1.cc in Bison 2.6. */
+ %locations
+ %debug
+ %skeleton "$1"
+ ]$2[
+ ]$3[
+ %code
+ {
+ # include <stdio.h>
+ # include <stdlib.h> // getenv
+ ]AT_YYERROR_DECLARE[
+ ]AT_YYLEX_DECLARE[
+ }
+ %%
+ exp:;
+ %%
+ ]AT_YYERROR_DEFINE[
+ ]AT_YYLEX_DEFINE[
+ int
+ main (void)
+ {
+ #define TEST(L1, C1, L2, C2)          \
+   ]AT_LOC_FIRST_LINE[ = L1;           \
+   ]AT_LOC_FIRST_COLUMN[ = C1;         \
+   ]AT_LOC_LAST_LINE[ = L2;            \
+   ]AT_LOC_LAST_COLUMN[ = C2;          \
+   ]YY_LOCATION_PRINT(stdout, AT_LOC)[;\
+   putchar ('\n');
+   TEST(1, 1, 1, 1);
+   TEST(2, 1, 2, 10);
+   TEST(3, 1, 4, 1);
+   TEST(5, 1, 6, 10);
+   TEST(7, 2, 0, 2);
+   TEST(8, 0, 8, 0);
+ }
+ ]])
+ AT_FULL_COMPILE([input])
+ AT_PARSER_CHECK([./input], 0,
+ [[1.1
+ 2.1-9
+ 3.1-4.0
+ 5.1-6.9
+ 7.2
+ 8.0
+ ]])
+ AT_BISON_OPTION_POPDEFS
+ AT_CLEANUP
+ ])
+ ## FIXME: test Java, and iterate over skeletons.
+ AT_TEST([yacc.c])
+ AT_TEST([glr.c])
+ #AT_TEST([lalr1.cc])
+ #AT_TEST([glr.cc])
+ m4_popdef([AT_TEST])
  ## ---------------- ##
  ## Exotic Dollars.  ##
  ## ---------------- ##
@@@ -182,7 -257,7 +257,7 @@@ AT_SETUP([Exotic Dollars]
  
  AT_BISON_OPTION_PUSHDEFS
  AT_DATA_GRAMMAR([[input.y]],
 -[[%error-verbose
 +[[%define parse.error verbose
  %debug
  %{
  ]AT_YYERROR_DECLARE[
@@@ -238,7 -313,7 +313,7 @@@ AT_PARSER_CHECK([./input], 0
  AT_DATA_GRAMMAR([[input.y]],
  [[
  %{
 -#include <stdio.h>
 +# include <stdio.h>
  ]AT_YYERROR_DECLARE[
  ]AT_YYLEX_DECLARE[
    typedef struct { int val; } stype;
@@@ -406,7 -481,7 +481,7 @@@ line
        $$ = -1;
        V(line,  $$, @$, ": ");
        V('(',   $1, @1, " ");
 -      fprintf (stderr, "error (@%d-%d) ", RANGE (@2));
 +      fprintf (stderr, "error (@%d-%d) ", RANGE(@2));
        V(')',   $3, @3, "\n");
      }
  ;
@@@ -662,7 -737,7 +737,7 @@@ m4_define([AT_CHECK_PRINTER_AND_DESTRUC
  
  $3
  _AT_CHECK_PRINTER_AND_DESTRUCTOR($[1], $[2], $[3], $[4],
 -[%error-verbose
 +[%define parse.error verbose
  %debug
  %verbose
  %locations
@@@ -673,13 -748,13 +748,13 @@@ AT_CLEANU
  
  
  AT_CHECK_PRINTER_AND_DESTRUCTOR([])
 -AT_CHECK_PRINTER_AND_DESTRUCTOR([], [ with union])
 +AT_CHECK_PRINTER_AND_DESTRUCTOR([], [with union])
  
  AT_CHECK_PRINTER_AND_DESTRUCTOR([%defines %skeleton "lalr1.cc"])
 -AT_CHECK_PRINTER_AND_DESTRUCTOR([%defines %skeleton "lalr1.cc"], [ with union])
 +AT_CHECK_PRINTER_AND_DESTRUCTOR([%defines %skeleton "lalr1.cc"], [with union])
  
  AT_CHECK_PRINTER_AND_DESTRUCTOR([%glr-parser])
 -AT_CHECK_PRINTER_AND_DESTRUCTOR([%glr-parser], [ with union])
 +AT_CHECK_PRINTER_AND_DESTRUCTOR([%glr-parser], [with union])
  
  
  
  AT_SETUP([Default tagless %printer and %destructor])
  AT_BISON_OPTION_PUSHDEFS([%locations])
  AT_DATA_GRAMMAR([[input.y]],
 -[[%error-verbose
 +[[%define parse.error verbose
  %debug
  %locations
  
@@@ -743,10 -818,7 +818,10 @@@ main (void
  }
  ]])
  
 -AT_BISON_CHECK([-o input.c input.y])
 +AT_BISON_CHECK([-o input.c input.y], [], [],
 +[[input.y:23.3-5: warning: useless %destructor for type <*> [-Wother]
 +input.y:23.3-5: warning: useless %printer for type <*> [-Wother]
 +]])
  AT_COMPILE([input])
  AT_PARSER_CHECK([./input], 1,
  [[<> destructor for 'd' @ 4.
@@@ -794,7 -866,7 +869,7 @@@ AT_CLEANU
  AT_SETUP([Default tagged and per-type %printer and %destructor])
  AT_BISON_OPTION_PUSHDEFS
  AT_DATA_GRAMMAR([[input.y]],
 -[[%error-verbose
 +[[%define parse.error verbose
  %debug
  
  %{
@@@ -858,10 -930,7 +933,10 @@@ main (void
  }
  ]])
  
 -AT_BISON_CHECK([-o input.c input.y])
 +AT_BISON_CHECK([-o input.c input.y], [], [],
 +[[input.y:22.3-4: warning: useless %destructor for type <> [-Wother]
 +input.y:22.3-4: warning: useless %printer for type <> [-Wother]
 +]])
  AT_COMPILE([input])
  AT_PARSER_CHECK([./input], 1,
  [[<*>/<field2>/e destructor.
@@@ -920,16 -989,16 +995,16 @@@ AT_CLEANU
  
  AT_SETUP([Default %printer and %destructor for user-defined end token])
  
 -# _AT_CHECK_DEFAULT_PRINTER_AND_DESTRUCTOR_FOR_END_TOKEN(TYPED)
 -# -------------------------------------------------------------
 -m4_define([_AT_CHECK_DEFAULT_PRINTER_AND_DESTRUCTOR_FOR_END_TOKEN],
 +# AT_TEST(TYPED)
 +# --------------
 +m4_pushdef([AT_TEST],
  [m4_if($1, 0,
    [m4_pushdef([kind], []) m4_pushdef([not_kind], [*])],
    [m4_pushdef([kind], [*]) m4_pushdef([not_kind], [])])
  
  AT_BISON_OPTION_PUSHDEFS([%locations])
  AT_DATA_GRAMMAR([[input]]$1[[.y]],
 -[[%error-verbose
 +[[%define parse.error verbose
  %debug
  %locations
  
@@@ -990,17 -1059,8 +1065,17 @@@ main (void
  ]])
  AT_BISON_OPTION_POPDEFS
  
 -AT_BISON_CHECK([-o input$1.c input$1.y])
 +AT_BISON_CHECK([-o input$1.c input$1.y], [], [],
 +[m4_if([$1], [0],
 +[[input0.y:23.3-5: warning: useless %destructor for type <*> [-Wother]
 +input0.y:23.3-5: warning: useless %printer for type <*> [-Wother]
 +]],
 +[[input1.y:23.3-4: warning: useless %destructor for type <> [-Wother]
 +input1.y:23.3-4: warning: useless %printer for type <> [-Wother]
 +]])])
 +
  AT_COMPILE([input$1])
 +
  AT_PARSER_CHECK([./input$1], 0,
  [[<]]kind[[> for 'E' @ 1.
  <]]kind[[> for 'S' @ 1.
@@@ -1023,10 -1083,8 +1098,10 @@@ m4_popdef([kind]
  m4_popdef([not_kind])
  ])
  
 -_AT_CHECK_DEFAULT_PRINTER_AND_DESTRUCTOR_FOR_END_TOKEN(0)
 -_AT_CHECK_DEFAULT_PRINTER_AND_DESTRUCTOR_FOR_END_TOKEN(1)
 +AT_TEST(0)
 +AT_TEST(1)
 +
 +m4_popdef([AT_TEST])
  
  AT_CLEANUP
  
@@@ -1086,10 -1144,7 +1161,10 @@@ main (void
  ]])
  AT_BISON_OPTION_POPDEFS
  
 -AT_BISON_CHECK([-o input.c input.y])
 +AT_BISON_CHECK([-o input.c input.y], [], [],
 +[[input.y:21.6-8: warning: useless %destructor for type <*> [-Wother]
 +input.y:21.6-8: warning: useless %printer for type <*> [-Wother]
 +]])
  AT_COMPILE([input])
  AT_PARSER_CHECK([./input], [1], [],
  [[Starting parse
@@@ -1188,10 -1243,7 +1263,10 @@@ main (void
  ]])
  AT_BISON_OPTION_POPDEFS
  
 -AT_BISON_CHECK([-o input.c input.y])
 +AT_BISON_CHECK([-o input.c input.y], [], [],
 +[[input.y:22.3-4: warning: useless %destructor for type <> [-Wother]
 +input.y:22.3-4: warning: useless %printer for type <> [-Wother]
 +]])
  AT_COMPILE([input])
  
  AT_CLEANUP
@@@ -1248,10 -1300,8 +1323,10 @@@ main (void
  AT_BISON_OPTION_POPDEFS
  
  AT_BISON_CHECK([-o input.c input.y], 0,,
 -[[input.y:33.3-23: warning: unset value: $$
 -input.y:30.3-35.37: warning: unused value: $3
 +[[input.y:24.70-72: warning: useless %destructor for type <*> [-Wother]
 +input.y:24.70-72: warning: useless %printer for type <*> [-Wother]
 +input.y:33.3-23: warning: unset value: $$ [-Wother]
 +input.y:30.3-35.37: warning: unused value: $3 [-Wother]
  ]])
  
  AT_COMPILE([input])
@@@ -1352,9 -1402,8 +1427,9 @@@ AT_CHECK_ACTION_LOCATIONS([[%printer]]
  ## Qualified $$ in actions.  ##
  ## ------------------------- ##
  
 -# Check that we can used qualified $$ (v.g., $<type>$) not only in
 -# rule actions, but also where $$ is valid: %printer and %destructor.
 +# Check that we can use qualified $$ (v.g., $<type>$) not only in rule
 +# actions, but also where $$ is valid: %destructor/%printer and
 +# %initial-action.
  #
  # FIXME: Not actually checking %destructor, but it's the same code as
  # %printer...
  m4_pushdef([AT_TEST],
  [AT_SETUP([[Qualified $$ in actions: $1]])
  
 -AT_BISON_OPTION_PUSHDEFS([%locations %skeleton "$1"])
 +AT_BISON_OPTION_PUSHDEFS([%skeleton "$1"])
  
  AT_DATA_GRAMMAR([[input.y]],
  [[%skeleton "$1"
 -%defines   // FIXME: Mandated by lalr1.cc in Bison 2.6.
 -%locations // FIXME: Mandated by lalr1.cc in Bison 2.6.
  %debug
  %code requires
  {
@@@ -1446,7 -1497,10 +1521,7 @@@ AT_FULL_COMPILE([[input]]
  AT_PARSER_CHECK([./input], 0, [], [stderr])
  # Don't be too picky on the traces, GLR is not exactly the same.  Keep
  # only the lines from the printer.
 -#
 -# Don't care about locations.  FIXME: remove their removal when Bison
 -# supports C++ without locations.
 -AT_CHECK([[sed -ne 's/([-0-9.]*: /(/;/ival:/p' stderr]], 0,
 +AT_CHECK([[sed -ne '/ival:/p' stderr]], 0,
  [[Reading a token: Next token is token UNTYPED (ival: 10, fval: 0.1)
  Shifting token UNTYPED (ival: 10, fval: 0.1)
  Reading a token: Next token is token INT (ival: 20, fval: 0.2)
@@@ -1484,37 -1538,37 +1559,37 @@@ AT_DATA([input.y]
  start: test2 test1 test0 testc;
  
  test2
 -: 'a' { semi;                 /* TEST:N:2 */ }
 -| 'b' { if (0) {no_semi}      /* TEST:N:2 */ }
 -| 'c' { if (0) {semi;}                /* TEST:N:2 */ }
 -| 'd' { semi;   no_semi               /* TEST:Y:2 */ }
 -| 'e' { semi(); no_semi()     /* TEST:Y:2 */ }
 -| 'f' { semi[]; no_semi[]     /* TEST:Y:2 */ }
 -| 'g' { semi++; no_semi++     /* TEST:Y:2 */ }
 -| 'h' { {no_semi} no_semi     /* TEST:Y:2 */ }
 -| 'i' { {semi;}   no_semi     /* TEST:Y:2 */ }
 +: 'a' { semi;                   /* TEST:N:2 */ }
 +| 'b' { if (0) {no_semi}        /* TEST:N:2 */ }
 +| 'c' { if (0) {semi;}          /* TEST:N:2 */ }
 +| 'd' { semi;   no_semi         /* TEST:Y:2 */ }
 +| 'e' { semi(); no_semi()       /* TEST:Y:2 */ }
 +| 'f' { semi[]; no_semi[]       /* TEST:Y:2 */ }
 +| 'g' { semi++; no_semi++       /* TEST:Y:2 */ }
 +| 'h' { {no_semi} no_semi       /* TEST:Y:2 */ }
 +| 'i' { {semi;}   no_semi       /* TEST:Y:2 */ }
  ;
  test1
 -  : 'a' { semi;                       // TEST:N:1 ;
 -} | 'b' { if (0) {no_semi}    // TEST:N:1 ;
 -} | 'c' { if (0) {semi;}      // TEST:N:1 ;
 -} | 'd' { semi;   no_semi     // TEST:Y:1 ;
 -} | 'e' { semi(); no_semi()   // TEST:Y:1 ;
 -} | 'f' { semi[]; no_semi[]   // TEST:Y:1 ;
 -} | 'g' { semi++; no_semi++   // TEST:Y:1 ;
 -} | 'h' { {no_semi} no_semi   // TEST:Y:1 ;
 -} | 'i' { {semi;}   no_semi   // TEST:Y:1 ;
 +  : 'a' { semi;                 // TEST:N:1 ;
 +} | 'b' { if (0) {no_semi}      // TEST:N:1 ;
 +} | 'c' { if (0) {semi;}        // TEST:N:1 ;
 +} | 'd' { semi;   no_semi       // TEST:Y:1 ;
 +} | 'e' { semi(); no_semi()     // TEST:Y:1 ;
 +} | 'f' { semi[]; no_semi[]     // TEST:Y:1 ;
 +} | 'g' { semi++; no_semi++     // TEST:Y:1 ;
 +} | 'h' { {no_semi} no_semi     // TEST:Y:1 ;
 +} | 'i' { {semi;}   no_semi     // TEST:Y:1 ;
  } ;
  test0
 -  : 'a' { semi;                       // TEST:N:1 {}
 -} | 'b' { if (0) {no_semi}    // TEST:N:1 {}
 -} | 'c' { if (0) {semi;}      // TEST:N:1 {}
 -} | 'd' { semi;   no_semi     // TEST:Y:1 {}
 -} | 'e' { semi(); no_semi()   // TEST:Y:1 {}
 -} | 'f' { semi[]; no_semi[]   // TEST:Y:1 {}
 -} | 'g' { semi++; no_semi++   // TEST:Y:1 {}
 -} | 'h' { {no_semi} no_semi   // TEST:Y:1 {}
 -} | 'i' { {semi;}   no_semi   // TEST:Y:1 {}
 +  : 'a' { semi;                 // TEST:N:1 {}
 +} | 'b' { if (0) {no_semi}      // TEST:N:1 {}
 +} | 'c' { if (0) {semi;}        // TEST:N:1 {}
 +} | 'd' { semi;   no_semi       // TEST:Y:1 {}
 +} | 'e' { semi(); no_semi()     // TEST:Y:1 {}
 +} | 'f' { semi[]; no_semi[]     // TEST:Y:1 {}
 +} | 'g' { semi++; no_semi++     // TEST:Y:1 {}
 +} | 'h' { {no_semi} no_semi     // TEST:Y:1 {}
 +} | 'i' { {semi;}   no_semi     // TEST:Y:1 {}
  } ;
  
  testc
@@@ -1531,42 -1585,42 +1606,42 @@@ string;"
  AT_BISON_OPTION_POPDEFS
  
  AT_BISON_CHECK([[-o input.c input.y]], [0], [],
 -[[input.y:8.48: warning: a ';' might be needed at the end of action code
 -input.y:8.48: warning: future versions of Bison will not add the ';'
 -input.y:9.48: warning: a ';' might be needed at the end of action code
 -input.y:9.48: warning: future versions of Bison will not add the ';'
 -input.y:10.48: warning: a ';' might be needed at the end of action code
 -input.y:10.48: warning: future versions of Bison will not add the ';'
 -input.y:11.48: warning: a ';' might be needed at the end of action code
 -input.y:11.48: warning: future versions of Bison will not add the ';'
 -input.y:12.48: warning: a ';' might be needed at the end of action code
 -input.y:12.48: warning: future versions of Bison will not add the ';'
 -input.y:13.48: warning: a ';' might be needed at the end of action code
 -input.y:13.48: warning: future versions of Bison will not add the ';'
 -input.y:20.1: warning: a ';' might be needed at the end of action code
 -input.y:20.1: warning: future versions of Bison will not add the ';'
 -input.y:21.1: warning: a ';' might be needed at the end of action code
 -input.y:21.1: warning: future versions of Bison will not add the ';'
 -input.y:22.1: warning: a ';' might be needed at the end of action code
 -input.y:22.1: warning: future versions of Bison will not add the ';'
 -input.y:23.1: warning: a ';' might be needed at the end of action code
 -input.y:23.1: warning: future versions of Bison will not add the ';'
 -input.y:24.1: warning: a ';' might be needed at the end of action code
 -input.y:24.1: warning: future versions of Bison will not add the ';'
 -input.y:25.1: warning: a ';' might be needed at the end of action code
 -input.y:25.1: warning: future versions of Bison will not add the ';'
 -input.y:31.1: warning: a ';' might be needed at the end of action code
 -input.y:31.1: warning: future versions of Bison will not add the ';'
 -input.y:32.1: warning: a ';' might be needed at the end of action code
 -input.y:32.1: warning: future versions of Bison will not add the ';'
 -input.y:33.1: warning: a ';' might be needed at the end of action code
 -input.y:33.1: warning: future versions of Bison will not add the ';'
 -input.y:34.1: warning: a ';' might be needed at the end of action code
 -input.y:34.1: warning: future versions of Bison will not add the ';'
 -input.y:35.1: warning: a ';' might be needed at the end of action code
 -input.y:35.1: warning: future versions of Bison will not add the ';'
 -input.y:36.1: warning: a ';' might be needed at the end of action code
 -input.y:36.1: warning: future versions of Bison will not add the ';'
 +[[input.y:8.48: warning: a ';' might be needed at the end of action code [-Wdeprecated]
 +input.y:8.48: warning: future versions of Bison will not add the ';' [-Wdeprecated]
 +input.y:9.48: warning: a ';' might be needed at the end of action code [-Wdeprecated]
 +input.y:9.48: warning: future versions of Bison will not add the ';' [-Wdeprecated]
 +input.y:10.48: warning: a ';' might be needed at the end of action code [-Wdeprecated]
 +input.y:10.48: warning: future versions of Bison will not add the ';' [-Wdeprecated]
 +input.y:11.48: warning: a ';' might be needed at the end of action code [-Wdeprecated]
 +input.y:11.48: warning: future versions of Bison will not add the ';' [-Wdeprecated]
 +input.y:12.48: warning: a ';' might be needed at the end of action code [-Wdeprecated]
 +input.y:12.48: warning: future versions of Bison will not add the ';' [-Wdeprecated]
 +input.y:13.48: warning: a ';' might be needed at the end of action code [-Wdeprecated]
 +input.y:13.48: warning: future versions of Bison will not add the ';' [-Wdeprecated]
 +input.y:20.1: warning: a ';' might be needed at the end of action code [-Wdeprecated]
 +input.y:20.1: warning: future versions of Bison will not add the ';' [-Wdeprecated]
 +input.y:21.1: warning: a ';' might be needed at the end of action code [-Wdeprecated]
 +input.y:21.1: warning: future versions of Bison will not add the ';' [-Wdeprecated]
 +input.y:22.1: warning: a ';' might be needed at the end of action code [-Wdeprecated]
 +input.y:22.1: warning: future versions of Bison will not add the ';' [-Wdeprecated]
 +input.y:23.1: warning: a ';' might be needed at the end of action code [-Wdeprecated]
 +input.y:23.1: warning: future versions of Bison will not add the ';' [-Wdeprecated]
 +input.y:24.1: warning: a ';' might be needed at the end of action code [-Wdeprecated]
 +input.y:24.1: warning: future versions of Bison will not add the ';' [-Wdeprecated]
 +input.y:25.1: warning: a ';' might be needed at the end of action code [-Wdeprecated]
 +input.y:25.1: warning: future versions of Bison will not add the ';' [-Wdeprecated]
 +input.y:31.1: warning: a ';' might be needed at the end of action code [-Wdeprecated]
 +input.y:31.1: warning: future versions of Bison will not add the ';' [-Wdeprecated]
 +input.y:32.1: warning: a ';' might be needed at the end of action code [-Wdeprecated]
 +input.y:32.1: warning: future versions of Bison will not add the ';' [-Wdeprecated]
 +input.y:33.1: warning: a ';' might be needed at the end of action code [-Wdeprecated]
 +input.y:33.1: warning: future versions of Bison will not add the ';' [-Wdeprecated]
 +input.y:34.1: warning: a ';' might be needed at the end of action code [-Wdeprecated]
 +input.y:34.1: warning: future versions of Bison will not add the ';' [-Wdeprecated]
 +input.y:35.1: warning: a ';' might be needed at the end of action code [-Wdeprecated]
 +input.y:35.1: warning: future versions of Bison will not add the ';' [-Wdeprecated]
 +input.y:36.1: warning: a ';' might be needed at the end of action code [-Wdeprecated]
 +input.y:36.1: warning: future versions of Bison will not add the ';' [-Wdeprecated]
  ]])
  
  AT_MATCHES_CHECK([input.c], [[/\* TEST:N:2 \*/ \}$]],       [[3]])
diff --combined tests/skeletons.at
index dafc74dab987bf2211d113b5d0639ff2616539df,fa496c9786dd2e493dcc4ae75496759d84ce677e..8632df16bf81cc383eb64eff04e4504701978187
@@@ -114,10 -114,10 +114,10 @@@ main (void
  }
  ]])
  
- AT_DATA([[input-cmd-line.y]],
+ AT_DATA_GRAMMAR([[input-cmd-line.y]],
  [AT_GRAM])
  
- AT_DATA([[input-gram.y]],
+ AT_DATA_GRAMMAR([[input-gram.y]],
  [[%skeleton "yacc.c"]
  AT_GRAM])
  
@@@ -191,8 -191,8 +191,8 @@@ start: 
  ]])
  
  AT_BISON_CHECK([[input1.y]], [[1]], [[]],
 -[[input1.y: warning: foow fubar
 -foow.y:2.3-5.3: warning: foowat fubar
 +[[input1.y: warning: foow fubar [-Wother]
 +foow.y:2.3-5.3: warning: foowat fubar [-Wother]
  input1.y: error: fooc fubar
  fooc.y:1.1-10.5: error: foocat fubar
  input1.y: fatal error: foof fubar
@@@ -281,7 -281,7 +281,7 @@@ start: 
  ]])
  
  AT_BISON_CHECK([[input2.y]], [[1]], [[]],
 -[[input2.y: warning: morning
 +[[input2.y: warning: morning [-Wother]
  foo.y:1.5-6: fatal error: M4 should exit immediately here
  ]])