bison-patches
[Top][All Lists]
Advanced

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

[PATCH 2/4] also support $<foo>$ in the %initial-action


From: Akim Demaille
Subject: [PATCH 2/4] also support $<foo>$ in the %initial-action
Date: Fri, 27 Jul 2012 17:13:51 +0200

scan-code.l is already passing argument to b4_dollar_dollar for the
initial acton, but its definition (of b4_dollar_dollar) does not use
this argument.

Generalize this definition, and use it for the %initial-action too.

* data/c.m4 (b4_dollar_dollar_, b4_dollar_pushdef, b4_dollar_popdef):
Instead of expecting a pointer, require a value, and use ".".
Since they are now generic enough, move to...
* data/c-like.m4: this new file.
* data/c.m4, data/java.m4: Load it.
* data/glr.c, data/lalr1.cc, data/lalr1.java, data/yacc.c: Use
b4_dollar_pushdef for the %initial-action.
* tests/actions.at: Check that.
* data/Makefile.am: Adjust.
* NEWS, doc/bison.texi: Document.
---
 NEWS             |  6 +++---
 data/Makefile.am |  1 +
 data/c-like.m4   | 44 ++++++++++++++++++++++++++++++++++++++++++++
 data/c.m4        | 29 ++---------------------------
 data/glr.c       | 10 ++++------
 data/java.m4     |  1 +
 data/lalr1.cc    | 10 ++++------
 data/lalr1.java  | 10 ++++------
 data/yacc.c      | 11 +++++------
 doc/bison.texi   |  6 +++---
 tests/actions.at | 10 +++++-----
 11 files changed, 76 insertions(+), 62 deletions(-)
 create mode 100644 data/c-like.m4

diff --git a/NEWS b/NEWS
index b62aac6..b99290c 100644
--- a/NEWS
+++ b/NEWS
@@ -28,15 +28,15 @@ GNU Bison NEWS
   for other actions such as printers, destructors, or initial actions.  It
   now does.
 
-** Type names in printers and destructors
+** Type names in actions
 
   For consistency with rule actions, it is now possible to qualify $$ by a
-  type-name in printers and destructors.  For instance:
+  type-name in destructors, printers, and initial actions.  For instance:
 
     %printer { fprintf (yyo, "(%d, %f)", $<ival>$, $<fval>$); } <*> <>;
 
   will display two values for each typed and untyped symbol (provided
-  that YYSTYPE supports it).
+  that YYSTYPE has both "ival" and "fval" fields).
 
 * Noteworthy changes in release 2.6 (2012-07-19) [stable]
 
diff --git a/data/Makefile.am b/data/Makefile.am
index c223188..1fd10b4 100644
--- a/data/Makefile.am
+++ b/data/Makefile.am
@@ -14,6 +14,7 @@
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 dist_pkgdata_DATA = README bison.m4 \
+   c-like.m4 \
    c-skel.m4 c.m4 yacc.c glr.c \
    c++-skel.m4 c++.m4 location.cc lalr1.cc glr.cc stack.hh \
    java-skel.m4 java.m4 lalr1.java
diff --git a/data/c-like.m4 b/data/c-like.m4
new file mode 100644
index 0000000..c2abce7
--- /dev/null
+++ b/data/c-like.m4
@@ -0,0 +1,44 @@
+                                                            -*- Autoconf -*-
+
+# Common code for C-like languages (C, C++, Java, etc.)
+
+# Copyright (C) 2012 Free Software Foundation, Inc.
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# b4_dollar_dollar_(VALUE, FIELD, DEFAULT-FIELD)
+# ----------------------------------------------
+# If FIELD (or DEFAULT-FIELD) is non-null, return "VALUE.FIELD",
+# otherwise just VALUE.  Be sure to pass "(VALUE)" is VALUE is a
+# pointer.
+m4_define([b4_dollar_dollar_],
+[m4_if([$2], [[]],
+       [m4_ifval([$3], [($1.$3)],
+                 [$1])],
+       [($1.$2)])])
+
+# b4_dollar_pushdef(VALUE-POINTER, DEFAULT-FIELD, LOCATION)
+# b4_dollar_popdef
+# ---------------------------------------------------------
+# Define b4_dollar_dollar for VALUE and DEFAULT-FIELD,
+# and b4_at_dollar for LOCATION.
+m4_define([b4_dollar_pushdef],
+[m4_pushdef([b4_dollar_dollar],
+            [b4_dollar_dollar_([$1], m4_dquote($][1), [$2])])dnl
+m4_pushdef([b4_at_dollar], [$3])dnl
+])
+m4_define([b4_dollar_popdef],
+[m4_popdef([b4_at_dollar])dnl
+m4_popdef([b4_dollar_dollar])dnl
+])
diff --git a/data/c.m4 b/data/c.m4
index 12794e0..45468e3 100644
--- a/data/c.m4
+++ b/data/c.m4
@@ -17,6 +17,7 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
+m4_include(b4_pkgdatadir/[c-like.m4])
 
 # b4_tocpp(STRING)
 # ----------------
@@ -417,32 +418,6 @@ m4_define([b4_case],
 $2
     break;])
 
-# b4_dollar_dollar_(NAME, FIELD, DEFAULT-FIELD)
-# ---------------------------------------------
-# If FIELD (or DEFAULT-FIELD) is non-null, read it in pointer NAME,
-# otherwise just dereference.
-m4_define([b4_dollar_dollar_],
-[m4_if([$2], [[]],
-       [m4_ifval([$3], [($1->$3)],
-                 [(*$1)])],
-       [($1->$2)])])
-
-# b4_dollar_pushdef(VALUE, DEFAULT-FIELD, LOCATION)
-# b4_dollar_popdef
-# -------------------------------------------------
-# Define b4_dollar_dollar for VALUE and DEFAULT-FIELD,
-# and b4_at_dollar for LOCATION.
-m4_define([b4_dollar_pushdef],
-[m4_pushdef([b4_dollar_dollar],
-   [b4_dollar_dollar_([$1], m4_dquote($][1), [$2])])dnl
-m4_pushdef([b4_at_dollar], [(*yylocationp)])dnl
-])
-m4_define([b4_dollar_popdef],
-[m4_popdef([b4_at_dollar])dnl
-m4_popdef([b4_dollar_dollar])dnl
-])
-
-
 # b4_symbol_actions(FILENAME, LINENO,
 #                   SYMBOL-TAG, SYMBOL-NUM,
 #                   SYMBOL-ACTION, SYMBOL-TYPENAME)
@@ -452,7 +427,7 @@ m4_popdef([b4_dollar_dollar])dnl
 # Define b4_dollar_dollar([TYPE-NAME]), and b4_at_dollar, which are
 # invoked where $<TYPE-NAME>$ and @$ were specified by the user.
 m4_define([b4_symbol_actions],
-[b4_dollar_pushdef([yyvaluep], [$6], [(*yylocationp)])dnl
+[b4_dollar_pushdef([(*yyvaluep)], [$6], [(*yylocationp)])dnl
       case $4: /* $3 */
 b4_syncline([$2], [$1])
        $5;
diff --git a/data/glr.c b/data/glr.c
index ebef969..08f6cd8 100644
--- a/data/glr.c
+++ b/data/glr.c
@@ -2302,12 +2302,10 @@ yyrecoverSyntaxError (yyGLRStack* 
yystackp]b4_user_formals[)
 #endif
 ])
 m4_ifdef([b4_initial_action], [
-m4_pushdef([b4_at_dollar],     [yylloc])dnl
-m4_pushdef([b4_dollar_dollar], [yylval])dnl
-  /* User initialization code.  */
-  b4_user_initial_action
-m4_popdef([b4_dollar_dollar])dnl
-m4_popdef([b4_at_dollar])])dnl
+b4_dollar_pushdef([yylval], [], [yylloc])dnl
+/* User initialization code.  */
+b4_user_initial_action
+b4_dollar_popdef])[]dnl
 [
   if (! yyinitGLRStack (yystackp, YYINITDEPTH))
     goto yyexhaustedlab;
diff --git a/data/java.m4 b/data/java.m4
index d137fd5..18ea30b 100644
--- a/data/java.m4
+++ b/data/java.m4
@@ -17,6 +17,7 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
+m4_include(b4_pkgdatadir/[c-like.m4])
 
 # b4_comment(TEXT)
 # ----------------
diff --git a/data/lalr1.cc b/data/lalr1.cc
index 17a8f22..c163903 100644
--- a/data/lalr1.cc
+++ b/data/lalr1.cc
@@ -536,12 +536,10 @@ do {                                      \
     YYCDEBUG << "Starting parse" << std::endl;
 
 ]m4_ifdef([b4_initial_action], [
-m4_pushdef([b4_at_dollar],     [yylloc])dnl
-m4_pushdef([b4_dollar_dollar], [yylval])dnl
-    /* User initialization code.  */
-    b4_user_initial_action
-m4_popdef([b4_dollar_dollar])dnl
-m4_popdef([b4_at_dollar])])dnl
+b4_dollar_pushdef([yylval], [], [yylloc])dnl
+/* User initialization code.  */
+b4_user_initial_action
+b4_dollar_popdef])[]dnl
 
   [  /* Initialize the stacks.  The initial state will be pushed in
        yynewstate, since the latter expects the semantical and the
diff --git a/data/lalr1.java b/data/lalr1.java
index 103c03d..d1410a1 100644
--- a/data/lalr1.java
+++ b/data/lalr1.java
@@ -458,12 +458,10 @@ b4_lexer_if([[
     yyerrstatus_ = 0;
 
 ]m4_ifdef([b4_initial_action], [
-m4_pushdef([b4_at_dollar],     [yylloc])dnl
-m4_pushdef([b4_dollar_dollar], [yylval])dnl
-    /* User initialization code.  */
-    b4_user_initial_action
-m4_popdef([b4_dollar_dollar])dnl
-m4_popdef([b4_at_dollar])])dnl
+b4_dollar_pushdef([yylval], [], [yylloc])dnl
+/* User initialization code.  */
+b4_user_initial_action
+b4_dollar_popdef])[]dnl
 
   [  /* Initialize the stack.  */
     yystack.push (yystate, yylval]b4_locations_if([, yylloc])[);
diff --git a/data/yacc.c b/data/yacc.c
index 5e77f84..1cd9ffb 100644
--- a/data/yacc.c
+++ b/data/yacc.c
@@ -1570,17 +1570,16 @@ b4_c_function_def([[yyparse]], [[int]], b4_parse_param)[
   yylloc.first_column = yylloc.last_column = ]b4_location_initial_column[;
 #endif]])
 m4_ifdef([b4_initial_action],[
-m4_pushdef([b4_at_dollar],     [m4_define([b4_at_dollar_used])yylloc])dnl
-m4_pushdef([b4_dollar_dollar], [m4_define([b4_dollar_dollar_used])yylval])dnl
+b4_dollar_pushdef([m4_define([b4_dollar_dollar_used])yylval], [],
+                  [m4_define([b4_at_dollar_used])yylloc])dnl
 /* User initialization code.  */
 b4_user_initial_action
-m4_popdef([b4_dollar_dollar])dnl
-m4_popdef([b4_at_dollar])])dnl
+b4_dollar_popdef[]dnl
 m4_ifdef([b4_dollar_dollar_used],[[  yyvsp[0] = yylval;
 ]])dnl
 m4_ifdef([b4_at_dollar_used], [[  yylsp[0] = yylloc;
-]])[
-  goto yysetstate;
+]])])dnl
+[  goto yysetstate;
 
 /*------------------------------------------------------------.
 | yynewstate -- Push a new state, which is found in yystate.  |
diff --git a/doc/bison.texi b/doc/bison.texi
index e50bd17..ad60505 100644
--- a/doc/bison.texi
+++ b/doc/bison.texi
@@ -4552,9 +4552,9 @@ code.
 @deffn {Directive} %initial-action @{ @var{code} @}
 @findex %initial-action
 Declare that the braced @var{code} must be invoked before parsing each time
address@hidden is called.  The @var{code} may use @code{$$} and
address@hidden@@$} --- initial value and location of the lookahead --- and the
address@hidden
address@hidden is called.  The @var{code} may use @code{$$} (or
address@hidden<@var{tag}>$}) and @code{@@$} --- initial value and location of 
the
+lookahead --- and the @code{%parse-param}.
 @end deffn
 
 For instance, if your locations use a file name, you may use
diff --git a/tests/actions.at b/tests/actions.at
index dd909b0..8232a00 100644
--- a/tests/actions.at
+++ b/tests/actions.at
@@ -1307,11 +1307,11 @@ AT_DATA_GRAMMAR([[input.y]],
 }
 ]])[
 
-// %initial-action
-// {
-//   $<ival>$ = 42;
-//   $<fval>$ = 4.2;
-// }
+%initial-action
+{
+  $<ival>$ = 42;
+  $<fval>$ = 4.2;
+}
 
 %%
 float: UNTYPED INT
-- 
1.7.11.3




reply via email to

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