From a5eb1ed262e86657c5af95e4a8eae258a2e49e4b Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Thu, 2 Sep 2004 13:04:11 +0000 Subject: [PATCH] * tests/actions.at (_AT_CHECK_PRINTER_AND_DESTRUCTOR): Adjust %printer calls to use cdebug_ when using lalr1.cc. * data/lalr1.cc (b4_yysymprint_generate): New. --- ChangeLog | 7 ++++ data/lalr1.cc | 90 ++++++++++++++++++++++++++++++++++-------------- tests/actions.at | 8 +++-- 3 files changed, 77 insertions(+), 28 deletions(-) diff --git a/ChangeLog b/ChangeLog index 55538670..131c2ebc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2004-09-02 Akim Demaille + + * tests/actions.at (_AT_CHECK_PRINTER_AND_DESTRUCTOR): Adjust + %printer calls to use cdebug_ when using lalr1.cc. + + * data/lalr1.cc (b4_yysymprint_generate): New. + 2004-08-30 Florian Krohm * data/glr.c: Guard the declarations of yypstack and yypdumpstack diff --git a/data/lalr1.cc b/data/lalr1.cc index 200f42d2..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 @@ -245,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_; @@ -363,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 @@ -421,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_) @@ -565,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]); } @@ -574,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_; @@ -633,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]); @@ -819,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_[] = { diff --git a/tests/actions.at b/tests/actions.at index 1e8d62f4..e8124e9e 100644 --- a/tests/actions.at +++ b/tests/actions.at @@ -342,8 +342,12 @@ m4_ifval([$6], , [#define YYSTYPE int])]) ]m4_ifval([$6], [%type 'x' ';' thing line input])[ -%printer { fprintf (yyoutput, "%d@%d-%d", $$, RANGE (@$)); } - input line thing 'x' +%printer + { + ]AT_LALR1_CC_IF([cdebug_ << @$ << ": " << $$;], + [fprintf (yyoutput, "%d@%d-%d", $$, RANGE (@$))])[; + } + input line thing 'x' %destructor { printf ("Freeing nterm input (%d@%d-%d)\n", $$, RANGE (@$)); } -- 2.45.2