# C++ skeleton for Bison
-# Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
-# Free Software Foundation, Inc.
+# Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
+# 2010 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
])
# 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])
m4_pushdef([b4_copyright_years],
- [2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009])
+ [2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010])
m4_define([b4_parser_class_name],
[b4_percent_define_get([[parser_class_name]])])
b4_defines_if([],
[b4_fatal([b4_skeleton[: using %%defines is mandatory]])])
-b4_locations_if(
-[# Backward compatibility.
-m4_define([b4_location_constructors])
-m4_include(b4_pkgdatadir/[location.cc])])
+b4_locations_if([b4_percent_define_ifdef([[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_percent_code_get([[requires]])[
]b4_parse_assert_if([#include <cassert>])[
+#include <stdexcept>
#include <string>
#include <iostream>
#include "stack.hh"
+]b4_locations_if([b4_percent_define_ifdef([[location_type]], [],
+ [[#include "location.hh"]])])[
-]b4_namespace_open[
-]b4_locations_if([ class position;
- class location;])[
-]b4_variant_if([b4_variant_define])[
-]b4_namespace_close[
-
-]b4_locations_if([#include "location.hh"])[
+]b4_variant_if([b4_namespace_open
+b4_variant_define
+b4_namespace_close])[
/* Enabling traces. */
#ifndef YYDEBUG
# define YYTOKEN_TABLE ]b4_token_table[
#endif
-]b4_locations_if([dnl
-[/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
- If N is 0, then set CURRENT to the empty location which ends
- the previous symbol: RHS[0] (always defined). */
-
-#ifndef YYLLOC_DEFAULT
-# define YYLLOC_DEFAULT(Current, Rhs, N) \
-do { \
- if (N) \
- { \
- (Current).begin = (Rhs)[1].location.begin; \
- (Current).end = (Rhs)[N].location.end; \
- } \
- else \
- { \
- (Current).begin = (Current).end = (Rhs)[0].location.end; \
- } \
-} while (false)
-#endif]])[
-
]b4_namespace_open[
/// A Bison parser.
/// \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
+ static bool yy_pact_value_is_default_ (int yyvalue);
+
+ /// Whether the given \c yytable_ value indicates a syntax error.
+ /// \param yyvalue the value to check
+ static bool yy_table_value_is_error_ (int yyvalue);
+
/// Internal symbol numbers.
typedef ]b4_int_type_for([b4_translate])[ token_number_type;
static const ]b4_int_type(b4_pact_ninf, b4_pact_ninf)[ yypact_ninf_;
/// The state.
state_type state;
- /// Return the type corresponding to this state.
+ /// The type (corresponding to \a state).
inline int type_get_ () const;
};
b4_percent_code_get[]dnl
[#ifndef YY_
-# if YYENABLE_NLS
+# if defined YYENABLE_NLS && YYENABLE_NLS
# if ENABLE_NLS
# include <libintl.h> /* FIXME: INFRINGES ON USER NAME SPACE */
# define YY_(msgid) dgettext ("bison-runtime", msgid)
# endif
#endif
+]b4_locations_if([dnl
+[/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
+ If N is 0, then set CURRENT to the empty location which ends
+ the previous symbol: RHS[0] (always defined). */
+
+#define YYRHSLOC(Rhs, K) ((Rhs)[K].location)
+#ifndef YYLLOC_DEFAULT
+# define YYLLOC_DEFAULT(Current, Rhs, N) \
+ do \
+ if (N) \
+ { \
+ (Current).begin = YYRHSLOC (Rhs, 1).begin; \
+ (Current).end = YYRHSLOC (Rhs, N).end; \
+ } \
+ else \
+ { \
+ (Current).begin = (Current).end = YYRHSLOC (Rhs, 0).end; \
+ } \
+ while (false)
+#endif]])[
+
/* Suppress unused-variable warnings by "using" E. */
#define YYUSE(e) ((void) (e))
return yydefgoto_[yylhs - yyntokens_];
}
+ inline bool
+ ]b4_parser_class_name[::yy_pact_value_is_default_ (int yyvalue)
+ {
+ return yyvalue == yypact_ninf_;
+ }
+
+ inline bool
+ ]b4_parser_class_name[::yy_table_value_is_error_ (int yyvalue)
+ {
+ return yyvalue == yytable_ninf_;
+ }
+
int
]b4_parser_class_name[::parse ()
{
symbol_type yyla;]b4_locations_if([[
/// The locations where the error started and ended.
- stack_symbol_type yyerror_range[2];]])[
+ stack_symbol_type yyerror_range[3];]])[
/// $$ and @@$.
stack_symbol_type yylhs;
/* Try to take a decision without lookahead. */
yyn = yypact_[yystack_[0].state];
- if (yyn == yypact_ninf_)
+ if (yy_pact_value_is_default_ (yyn))
goto yydefault;
/* Read a lookahead token. */
yyn = yytable_[yyn];
if (yyn <= 0)
{
- if (yyn == 0 || yyn == yytable_ninf_)
+ if (yy_table_value_is_error_ (yyn))
goto yyerrlab;
yyn = -yyn;
goto yyreduce;
// Perform the reduction.
YY_REDUCE_PRINT (yyn);
- switch (yyn)
+ try
+ {
+ switch (yyn)
{
]b4_user_actions[
default:
break;
}
+ }
+ catch (const syntax_error& yyexc)
+ {
+ error (]b4_args(b4_locations_if([yyexc.location]),
+ [[yyexc.what()]])[);
+ YYERROR;
+ }
YY_SYMBOL_PRINT ("-> $$ =", yylhs);
]b4_variant_if([[
// Destroy the rhs symbols.
}
]b4_locations_if([[
- yyerror_range[0].location = yyla.location;]])[
+ yyerror_range[1].location = yyla.location;]])[
if (yyerrstatus_ == 3)
{
/* If just tried and failed to reuse lookahead token after an
/* Return failure if at end of input. */
if (yyla.type == yyeof_)
YYABORT;
- else
+ else if (!yyempty)
{
yy_destroy_ ("Error: discarding", yyla);
yyempty = true;
code. */
if (false)
goto yyerrorlab;]b4_locations_if([[
- yyerror_range[0].location = yystack_[yylen - 1].location;]])b4_variant_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
for (;;)
{
yyn = yypact_[yystack_[0].state];
- if (yyn != yypact_ninf_)
+ if (!yy_pact_value_is_default_ (yyn))
{
yyn += yyterror_;
if (0 <= yyn && yyn <= yylast_ && yycheck_[yyn] == yyterror_)
if (yystack_.size () == 1)
YYABORT;
]b4_locations_if([[
- yyerror_range[0].location = yystack_[0].location;]])[
+ yyerror_range[1].location = yystack_[0].location;]])[
yy_destroy_ ("Error: popping", yystack_[0]);
yypop_ ();
YY_STACK_PRINT ();
}
]b4_locations_if([[
- yyerror_range[1].location = yyla.location;
- YYLLOC_DEFAULT (error_token.location, (yyerror_range - 1), 2);]])[
+ yyerror_range[2].location = yyla.location;
+ YYLLOC_DEFAULT (error_token.location, yyerror_range, 2);]])[
/* Shift the error token. */
error_token.state = yyn;
char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
yyarg[yycount++] = yytname_[yytoken];
for (int yyx = yyxbegin; yyx < yyxend; ++yyx)
- if (yycheck_[yyx + yyn] == yyx && yyx != yyterror_)
+ if (yycheck_[yyx + yyn] == yyx && yyx != yyterror_
+ && !yy_table_value_is_error_ (yytable_[yyx + yyn]))
{
if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
{