bison-patches
[Top][All Lists]
Advanced

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

[PATCH] c++: use YYRHSLOC


From: Akim Demaille
Subject: [PATCH] c++: use YYRHSLOC
Date: Mon, 10 May 2010 10:01:12 +0200

Installed in master only.


From bb9191dd311e4c6d80f8dd12c6a7ce9254404fbc Mon Sep 17 00:00:00 2001
From: Akim Demaille <address@hidden>
Date: Sun, 9 May 2010 23:58:50 +0200
Subject: [PATCH] c++: use YYRHSLOC.

        * data/lalr1.cc (YYRHSLOC): New.
        (YYLLOC_DEFAULT): Use it.
        * data/glr.cc: If location_type was user defined, do not include
        location.hh, and do not produce location.hh and position.hh.
        * tests/calc.at (YYLLOC_DEFAULT): Use YYRHSLOC.
        Check that glr.cc supports user defined location_type.
        * NEWS: Document this.
---
 ChangeLog     |   11 +++++++++++
 NEWS          |   38 +++++++++++++++++++++++++++++++++++++-
 data/glr.cc   |    6 ++++--
 data/lalr1.cc |   25 +++++++++++++------------
 tests/calc.at |   23 ++++++++++++-----------
 5 files changed, 77 insertions(+), 26 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 724a121..cea5f02 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2010-05-10  Akim Demaille  <address@hidden>
+
+       c++: use YYRHSLOC.
+       * data/lalr1.cc (YYRHSLOC): New.
+       (YYLLOC_DEFAULT): Use it.
+       * data/glr.cc: If location_type was user defined, do not include
+       location.hh, and do not produce location.hh and position.hh.
+       * tests/calc.at (YYLLOC_DEFAULT): Use YYRHSLOC.
+       Check that glr.cc supports user defined location_type.
+       * NEWS: Document this.
+
 2010-05-07  Akim Demaille  <address@hidden>
 
        doc: fix typo.
diff --git a/NEWS b/NEWS
index 7097f3b..cacdb77 100644
--- a/NEWS
+++ b/NEWS
@@ -3,10 +3,46 @@ Bison News
 
 * Changes in version ?.? (????-??-??):
 
+** C++ parsers use YYRHSLOC
+
+  Similarly to the C parsers, the C++ parsers now define the YYRHSLOC
+  macro and use it in the default YYLLOC_DEFAULT.  You are encouraged
+  to use it.  If, for instance, your location structure has "first"
+  and "last" members, instead of
+
+      # define YYLLOC_DEFAULT(Current, Rhs, N)                             \
+        do                                                                 \
+          if (N)                                                           \
+            {                                                              \
+              (Current).first = (Rhs)[1].location.first;                   \
+              (Current).last  = (Rhs)[N].location.last;                    \
+            }                                                              \
+          else                                                             \
+            {                                                              \
+              (Current).first = (Current).last = (Rhs)[0].location.last;   \
+            }                                                              \
+        while (false)
+
+  use:
+
+      # define YYLLOC_DEFAULT(Current, Rhs, N)                             \
+        do                                                                 \
+          if (N)                                                           \
+            {                                                              \
+              (Current).first = YYRHSLOC (Rhs, 1).first;                   \
+              (Current).last  = YYRHSLOC (Rhs, N).last;                    \
+            }                                                              \
+          else                                                             \
+            {                                                              \
+              (Current).first = (Current).last = YYRHSLOC (Rhs, 0).last;   \
+            }                                                              \
+        while (false)
+
+
 ** Additional yylex/yyparse arguments
 
   The new directive %param declare additional argument to both yylex
-  and yyparse.  The %lex-param, %parse-param, and %param directive
+  and yyparse.  The %lex-param, %parse-param, and %param directives
   support one or more arguments.  Instead of
 
       %lex-param   {arg1_type *arg1}
diff --git a/data/glr.cc b/data/glr.cc
index feed669..24b3fbb 100644
--- a/data/glr.cc
+++ b/data/glr.cc
@@ -51,7 +51,8 @@ b4_defines_if([],
               [b4_fatal([b4_skeleton[: using %%defines is mandatory]])])
 
 m4_include(b4_pkgdatadir/[c++.m4])
-m4_include(b4_pkgdatadir/[location.cc])
+b4_percent_define_ifdef([[location_type]], [],
+                        [m4_include(b4_pkgdatadir/[location.cc])])
 
 m4_define([b4_parser_class_name],
           [b4_percent_define_get([[parser_class_name]])])
@@ -226,7 +227,8 @@ b4_copyright([Skeleton interface for Bison GLR parsers in 
C++],
 #include <stdexcept>
 #include <string>
 #include <iostream>
-#include "location.hh"
+]b4_percent_define_ifdef([[location_type]], [],
+                         [[#include "location.hh"]])[
 
 /* Using locations.  */
 #define YYLSP_NEEDED ]b4_locations_if([1], [0])[
diff --git a/data/lalr1.cc b/data/lalr1.cc
index 7cb7db6..8094ccc 100644
--- a/data/lalr1.cc
+++ b/data/lalr1.cc
@@ -180,19 +180,20 @@ b4_namespace_close])[
    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 = (Rhs)[1].location.begin;                \
-      (Current).end   = (Rhs)[N].location.end;                 \
-    }                                                           \
-  else                                                          \
-    {                                                           \
-      (Current).begin = (Current).end = (Rhs)[0].location.end; \
-    }                                                           \
-} while (false)
+# 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]])[
 
 ]b4_namespace_open[
diff --git a/tests/calc.at b/tests/calc.at
index 08ccbe4..5046d23 100644
--- a/tests/calc.at
+++ b/tests/calc.at
@@ -171,17 +171,17 @@ AT_SKEL_CC_IF(
   };
 
 # define YYLLOC_DEFAULT(Current, Rhs, N)                                \
-do {                                                                    \
-  if (N)                                                                \
-    {                                                                   \
-      (Current).first = (Rhs)[1].location.first;                       \
-      (Current).last  = (Rhs)[N].location.last;                         \
-    }                                                                   \
-  else                                                                  \
-    {                                                                   \
-      (Current).first = (Current).last = (Rhs)[0].location.last;       \
-    }                                                                   \
-} while (false)
+  do                                                                    \
+    if (N)                                                              \
+      {                                                                 \
+        (Current).first = YYRHSLOC (Rhs, 1).first;                      \
+        (Current).last  = YYRHSLOC (Rhs, N).last;                       \
+      }                                                                 \
+    else                                                                \
+      {                                                                 \
+        (Current).first = (Current).last = YYRHSLOC (Rhs, 0).last;      \
+      }                                                                 \
+  while (false)
 
 ]])[
   /* Exercise pre-prologue dependency to %union.  */
@@ -716,6 +716,7 @@ m4_define([AT_CHECK_CALC_GLR_CC],
 [AT_CHECK_CALC([%language "C++" %glr-parser %defines %locations] $@)])
 
 AT_CHECK_CALC_GLR_CC([])
+AT_CHECK_CALC_GLR_CC([%define location_type Span])
 AT_CHECK_CALC_GLR_CC([%define parse.error verbose %name-prefix "calc" %verbose 
%yacc])
 
 AT_CHECK_CALC_GLR_CC([%debug])
-- 
1.7.0.5






reply via email to

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