]> git.saurik.com Git - bison.git/commitdiff
also support $<foo>$ in the %initial-action
authorAkim Demaille <akim@lrde.epita.fr>
Fri, 27 Jul 2012 12:20:00 +0000 (14:20 +0200)
committerAkim Demaille <akim@lrde.epita.fr>
Fri, 27 Jul 2012 12:47:20 +0000 (14:47 +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
data/Makefile.am
data/c-like.m4 [new file with mode: 0644]
data/c.m4
data/glr.c
data/java.m4
data/lalr1.cc
data/lalr1.java
data/yacc.c
doc/bison.texi
tests/actions.at

diff --git a/NEWS b/NEWS
index b62aac6dda225991bda53e77c22d844831d85210..b99290c92662b1e099ebf2e3a1955850136b9b6d 100644 (file)
--- 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]
 
index c22318863564f92175fa45cfb87424965b7829a4..1fd10b4a1f30175bb231e64db70ef6d9e6817997 100644 (file)
@@ -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 (file)
index 0000000..c2abce7
--- /dev/null
@@ -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
+])
index 12794e06c64614cdc53a25eeb67d6822b5a5d5b2..45468e3cac1305dbd5f398f8467978745c13e2d8 100644 (file)
--- 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;
index ebef9694d4d008acc1bf80ef6426ccba42166242..08f6cd8d0db55dd4a6a6208566683b58ecd4e51b 100644 (file)
@@ -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;
index d137fd597d8375da7baf3d9da3f45064ebf44e5a..18ea30b5086b379ecc794a746dd4718daaa18528 100644 (file)
@@ -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)
 # ----------------
index 17a8f22c032ac8fadda107f5bee7bf0aba4e27c3..c1639033f3fbd5194f92bd2b44f56144637f5406 100644 (file)
@@ -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
index 103c03ddc83032356c329ea0ec421e2cea130d40..d1410a10cf806b6598d71e90c44bc1d38a1e22a5 100644 (file)
@@ -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])[);
index 5e77f844dc43be14a088c9e4642fc516ef0568f6..1cd9ffbb288493297bb57a88b93f4d21c22569f4 100644 (file)
@@ -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.  |
index e50bd1717117cea21ff64a7c3a24a4e8fc34acb0..ad60505446e35fda04d8ba31ed0f47dfaad214c3 100644 (file)
@@ -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
-@code{yyparse} is called.  The @var{code} may use @code{$$} and
-@code{@@$} --- initial value and location of the lookahead --- and the
-@code{%parse-param}.
+@code{yyparse} is called.  The @var{code} may use @code{$$} (or
+@code{$<@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
index dd909b00d7496534390b078c5afd739a63094136..8232a00780284ddd523eb1ee6d104836ce391b0c 100644 (file)
@@ -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