X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/8dd162d3ff10fd7fb6f748a885f8055232691c48..a5eb1ed262e86657c5af95e4a8eae258a2e49e4b:/data/lalr1.cc?ds=sidebyside diff --git a/data/lalr1.cc b/data/lalr1.cc index fdd8c259..b07cb193 100644 --- a/data/lalr1.cc +++ b/data/lalr1.cc @@ -114,6 +114,35 @@ m4_define([b4_cc_var_decls], 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. @@ -122,6 +151,7 @@ m4_define([b4_cxx_destruct_def], 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 @@ -161,7 +191,9 @@ b4_syncline([@oline@], [@ofile@])[ # 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; @@ -243,6 +275,12 @@ namespace yy 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_; @@ -361,6 +399,9 @@ do { \ #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 @@ -419,15 +460,14 @@ yy::]b4_parser_class_name[::parse () #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_) @@ -563,8 +603,17 @@ b4_syncline([@oline@], [@ofile@])[ 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]); } @@ -572,8 +621,12 @@ b4_syncline([@oline@], [@ofile@])[ 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_; @@ -631,22 +684,9 @@ 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]); @@ -817,7 +857,7 @@ yy::]b4_parser_class_name[::r2_[] = #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_[] = {