From: Akim Demaille Date: Fri, 27 Jul 2012 12:20:00 +0000 (+0200) Subject: also support $$ in the %initial-action X-Git-Tag: v2.6.1~6 X-Git-Url: https://git.saurik.com/bison.git/commitdiff_plain/cd735a8c6caab8f705fe551cc0316d0292eef11d also support $$ in the %initial-action 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. --- diff --git a/NEWS b/NEWS index b62aac6d..b99290c9 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)", $$, $$); } <*> <>; 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 c2231886..1fd10b4a 100644 --- a/data/Makefile.am +++ b/data/Makefile.am @@ -14,6 +14,7 @@ # along with this program. If not, see . 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 00000000..c2abce7e --- /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 . + +# 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 12794e06..45468e3c 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 . +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 $$ 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 ebef9694..08f6cd8d 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 d137fd59..18ea30b5 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 . +m4_include(b4_pkgdatadir/[c-like.m4]) # b4_comment(TEXT) # ---------------- diff --git a/data/lalr1.cc b/data/lalr1.cc index 17a8f22c..c1639033 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 103c03dd..d1410a10 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 5e77f844..1cd9ffbb 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 e50bd171..ad605054 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 -@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 diff --git a/tests/actions.at b/tests/actions.at index dd909b00..8232a007 100644 --- a/tests/actions.at +++ b/tests/actions.at @@ -1307,11 +1307,11 @@ AT_DATA_GRAMMAR([[input.y]], } ]])[ -// %initial-action -// { -// $$ = 42; -// $$ = 4.2; -// } +%initial-action +{ + $$ = 42; + $$ = 4.2; +} %% float: UNTYPED INT