m4_define([b4_cc_var_decl],
[ $1;])
+
+# b4_yysymprint_generate(FUNCTION-DECLARATOR)
+# -------------------------------------------
+# Generate the "symprint_" member function.
+m4_define([b4_yysymprint_generate],
+[[/*--------------------------------.
+| Print this symbol on YYOUTPUT. |
+`--------------------------------*/
+
+]void
+yy::b4_parser_class_name::symprint_ (int yytype, const SemanticType *yyvaluep, const LocationType *yylocationp)[
+{
+ /* Pacify ``unused variable'' warnings. */
+ (void) yyvaluep;
+ (void) yylocationp;
+
+ cdebug_ << (yytype < ntokens_ ? "token" : "nterm")
+ << ' ' << name_[yytype] << " (";
+ switch (yytype)
+ {
+]m4_map([b4_symbol_actions], m4_defn([b4_symbol_printers]))dnl
+[ default:
+ break;
+ }
+ cdebug_ << ')';
+}
+]])
+
+
# b4_cxx_destruct_def(IGNORED-ARGUMENTS)
# --------------------------------------
# Declare the destruct_ method.
yy::b4_parser_class_name::destruct_ (int yytype, SemanticType *yyvaluep, LocationType *yylocationp)[]dnl
])
+
# We do want M4 expansion after # for CPP macros.
m4_changecom()
m4_divert(0)dnl
# define YYERROR_VERBOSE ]b4_error_verbose[
#endif
-#ifndef YYSTYPE
+#ifdef YYSTYPE
+typedef YYSTYPE yystype;
+#else
]m4_ifdef([b4_stype],
[b4_syncline([b4_stype_line], [b4_filename])
typedef union b4_stype yystype;
virtual void error_ ();
virtual void print_ ();
virtual void report_syntax_error_ ();
+#if YYDEBUG
+ virtual void symprint_ (int yytype,
+ const SemanticType *yyvaluep,
+ const LocationType *yylocationp);
+#endif /* ! YYDEBUG */
+
/* Stacks. */
StateStack state_stack_;
int debug_;
std::ostream &cdebug_;
- /* Lookahead and lookahead in internal form. */
+ /* Look-ahead and look-ahead in internal form. */
int looka_;
int ilooka_;
/* Message. */
std::string message;
- /* Semantic value and location of lookahead token. */
+ /* Semantic value and location of look-ahead token. */
SemanticType value;
LocationType location;
/* Beginning of the last erroneous token popped off. */
#define YYABORT goto yyabortlab
#define YYERROR goto yyerrorlab
+#if YYDEBUG
+]b4_yysymprint_generate([b4_cxx_symprint_def])[
+#endif /* ! YYDEBUG */
]b4_yydestruct_generate([b4_cxx_destruct_def])[
int
/* Backup. */
yybackup:
- /* Try to take a decision without lookahead. */
+ /* Try to take a decision without look-ahead. */
n_ = pact_[state_];
if (n_ == pact_ninf_)
goto yydefault;
- /* Read a lookahead token. */
+ /* Read a look-ahead token. */
if (looka_ == empty_)
{
YYCDEBUG << "Reading a token: ";
#if YYDEBUG
if (debug_)
{
- YYCDEBUG << "Next token is " << looka_
- << " (" << name_[ilooka_];
- print_ ();
- YYCDEBUG << ')' << std::endl;
+ cdebug_ << "Next token is ";
+ symprint_ (ilooka_, &value, &location);
+ cdebug_ << std::endl;
}
#endif
}
- /* If the proper action on seeing token YYTOKEN is to reduce or to
+ /* If the proper action on seeing token ILOOKA_ is to reduce or to
detect an error, take that action. */
n_ += ilooka_;
if (n_ < 0 || last_ < n_ || check_[n_] != ilooka_)
if (n_ == final_)
goto yyacceptlab;
- /* Shift the lookahead token. */
+ /* Shift the look-ahead token. */
#if YYDEBUG
YYCDEBUG << "Shifting token " << looka_
<< " (" << name_[ilooka_] << "), ";
error_start_ = location.begin;
if (errstatus_ == 3)
{
- /* If just tried and failed to reuse lookahead token after an
+ /* If just tried and failed to reuse look-ahead token after an
error, discard it. */
/* Return failure if at end of input. */
location_stack_.pop ();
if (state_stack_.height () == 1)
YYABORT;
-// YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp);
- destruct_ (stos_[state_stack_[0]],
+#if YYDEBUG
+ if (debug_)
+ {
+ cdebug_ << "Error: popping ";
+ symprint_ (stos_[state_stack_[0]],
+ &semantic_stack_[0],
+ &location_stack_[0]);
+ cdebug_ << std::endl;
+ }
+#endif // YYDEBUG
+ destruct_ (stos_[state_stack_[0]],
&semantic_stack_[0],
&location_stack_[0]);
}
else
{
#if YYDEBUG
- YYCDEBUG << "Discarding token " << looka_
- << " (" << name_[ilooka_] << ")." << std::endl;
+ if (debug_)
+ {
+ cdebug_ << "Error: discarding ";
+ symprint_ (ilooka_, &value, &location);
+ cdebug_ << std::endl;
+ }
#endif
destruct_ (ilooka_, &value, &location);
looka_ = empty_;
}
}
- /* Else will try to reuse lookahead token after shifting the error
+ /* Else will try to reuse look-ahead token after shifting the error
token. */
goto yyerrlab1;
#if YYDEBUG
if (debug_)
{
- if (stos_[state_] < ntokens_)
- {
- YYCDEBUG << "Error: popping token "
- << token_number_[stos_[state_]]
- << " (" << name_[stos_[state_]];
-# ifdef YYPRINT
- YYPRINT (stderr, token_number_[stos_[state_]],
- semantic_stack_.top ());
-# endif
- YYCDEBUG << ')' << std::endl;
- }
- else
- {
- YYCDEBUG << "Error: popping nonterminal ("
- << name_[stos_[state_]] << ')' << std::endl;
- }
+ cdebug_ << "Error: popping ";
+ symprint_ (stos_[state_], &semantic_stack_[0], &location_stack_[0]);
+ cdebug_ << std::endl;
}
#endif
destruct_ (stos_[state_], &semantic_stack_[0], &location_stack_[0]);
]b4_check[
};
-#if YYDEBUG
/* STOS_[STATE-NUM] -- The (internal number of the) accessing
symbol of state STATE-NUM. */
const ]b4_int_type_for([b4_stos])[
]b4_stos[
};
+#if YYDEBUG
/* TOKEN_NUMBER_[YYLEX-NUM] -- Internal token number corresponding
to YYLEX-NUM. */
const ]b4_int_type_for([b4_toknum])[
#if YYDEBUG || YYERROR_VERBOSE
/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
- First, the terminals, then, starting at YYNTOKENS, nonterminals. */
+ First, the terminals, then, starting at NTOKENS_, nonterminals. */
const char*
const yy::]b4_parser_class_name[::name_[] =
{