bison-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

FYI: lalr1.cc: symprint_


From: Akim Demaille
Subject: FYI: lalr1.cc: symprint_
Date: Thu, 02 Sep 2004 15:03:11 +0200
User-agent: Gnus/5.1006 (Gnus v5.10.6) Emacs/21.3 (gnu/linux)

This is a back port of what's already implemented in yacc.c as
yysymprint.

I'm ambivalent with %printer.  In particular I cannot make my mind wrt
locations: is it up to the user to output locations, or not?

* up to the user
  + more user control
  - more user code to write
  - complex user code to support optional use of locations
    (this does matter for the test suite for instance, which tries
    to output parsers.y for several cases, therefore we will have to
    be ready to output %printer clauses with or without location
    support)

* left to symprint_ itself
  - less user control
  + less code to write
  + locations of non %printer equipped symbols is still reported

I used to prefer "leave it all to the user", but now, I tend to lean
towards the "leave it to the system".

2004-09-02  Akim Demaille  <address@hidden>

        * 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.
        (symprint_): New member function, defined when YYDEBUG.
        Use it consistently instead of token/nterm debugging output by
        hand.

Index: data/lalr1.cc
===================================================================
RCS file: /cvsroot/bison/bison/data/lalr1.cc,v
retrieving revision 1.47
diff -u -u -r1.47 lalr1.cc
--- data/lalr1.cc 22 Jul 2004 14:39:34 -0000 1.47
+++ data/lalr1.cc 2 Sep 2004 12:55:28 -0000
@@ -114,6 +114,35 @@
 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 @@
 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 @@
     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 @@
 #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 @@
 #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 @@
                  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 @@
       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 @@
 #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 @@
 
 #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_[] =
 {
Index: tests/actions.at
===================================================================
RCS file: /cvsroot/bison/bison/tests/actions.at,v
retrieving revision 1.33
diff -u -u -r1.33 actions.at
--- tests/actions.at 22 Jul 2004 14:40:21 -0000 1.33
+++ tests/actions.at 2 Sep 2004 12:55:28 -0000
@@ -342,8 +342,12 @@
 
 ]m4_ifval([$6], [%type <ival> 'x' ';' thing line input])[
 
-%printer { fprintf (yyoutput, "address@hidden", $$, RANGE (@$)); }
-   input line thing 'x'
+%printer
+  {
+    ]AT_LALR1_CC_IF([cdebug_ << @$ << ": " << $$;],
+                    [fprintf (yyoutput, "address@hidden", $$, RANGE (@$))])[;
+  }
+  input line thing 'x'
 
 %destructor
   { printf ("Freeing nterm input (address@hidden)\n", $$, RANGE (@$)); }




reply via email to

[Prev in Thread] Current Thread [Next in Thread]