also support $<foo>$ 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.
This commit is contained in:
Akim Demaille
2012-07-27 14:20:00 +02:00
parent d6a44ffd00
commit cd735a8c6c
11 changed files with 76 additions and 62 deletions

6
NEWS
View File

@@ -28,15 +28,15 @@ GNU Bison NEWS
for other actions such as printers, destructors, or initial actions. It for other actions such as printers, destructors, or initial actions. It
now does. 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 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>$); } <*> <>; %printer { fprintf (yyo, "(%d, %f)", $<ival>$, $<fval>$); } <*> <>;
will display two values for each typed and untyped symbol (provided 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] * Noteworthy changes in release 2.6 (2012-07-19) [stable]

View File

@@ -14,6 +14,7 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
dist_pkgdata_DATA = README bison.m4 \ dist_pkgdata_DATA = README bison.m4 \
c-like.m4 \
c-skel.m4 c.m4 yacc.c glr.c \ c-skel.m4 c.m4 yacc.c glr.c \
c++-skel.m4 c++.m4 location.cc lalr1.cc glr.cc stack.hh \ c++-skel.m4 c++.m4 location.cc lalr1.cc glr.cc stack.hh \
java-skel.m4 java.m4 lalr1.java java-skel.m4 java.m4 lalr1.java

44
data/c-like.m4 Normal file
View File

@@ -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
])

View File

@@ -17,6 +17,7 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
m4_include(b4_pkgdatadir/[c-like.m4])
# b4_tocpp(STRING) # b4_tocpp(STRING)
# ---------------- # ----------------
@@ -417,32 +418,6 @@ m4_define([b4_case],
$2 $2
break;]) 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, # b4_symbol_actions(FILENAME, LINENO,
# SYMBOL-TAG, SYMBOL-NUM, # SYMBOL-TAG, SYMBOL-NUM,
# SYMBOL-ACTION, SYMBOL-TYPENAME) # 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 # Define b4_dollar_dollar([TYPE-NAME]), and b4_at_dollar, which are
# invoked where $<TYPE-NAME>$ and @$ were specified by the user. # invoked where $<TYPE-NAME>$ and @$ were specified by the user.
m4_define([b4_symbol_actions], m4_define([b4_symbol_actions],
[b4_dollar_pushdef([yyvaluep], [$6], [(*yylocationp)])dnl [b4_dollar_pushdef([(*yyvaluep)], [$6], [(*yylocationp)])dnl
case $4: /* $3 */ case $4: /* $3 */
b4_syncline([$2], [$1]) b4_syncline([$2], [$1])
$5; $5;

View File

@@ -2302,12 +2302,10 @@ yyrecoverSyntaxError (yyGLRStack* yystackp]b4_user_formals[)
#endif #endif
]) ])
m4_ifdef([b4_initial_action], [ m4_ifdef([b4_initial_action], [
m4_pushdef([b4_at_dollar], [yylloc])dnl b4_dollar_pushdef([yylval], [], [yylloc])dnl
m4_pushdef([b4_dollar_dollar], [yylval])dnl /* User initialization code. */
/* User initialization code. */ b4_user_initial_action
b4_user_initial_action b4_dollar_popdef])[]dnl
m4_popdef([b4_dollar_dollar])dnl
m4_popdef([b4_at_dollar])])dnl
[ [
if (! yyinitGLRStack (yystackp, YYINITDEPTH)) if (! yyinitGLRStack (yystackp, YYINITDEPTH))
goto yyexhaustedlab; goto yyexhaustedlab;

View File

@@ -17,6 +17,7 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
m4_include(b4_pkgdatadir/[c-like.m4])
# b4_comment(TEXT) # b4_comment(TEXT)
# ---------------- # ----------------

View File

@@ -536,12 +536,10 @@ do { \
YYCDEBUG << "Starting parse" << std::endl; YYCDEBUG << "Starting parse" << std::endl;
]m4_ifdef([b4_initial_action], [ ]m4_ifdef([b4_initial_action], [
m4_pushdef([b4_at_dollar], [yylloc])dnl b4_dollar_pushdef([yylval], [], [yylloc])dnl
m4_pushdef([b4_dollar_dollar], [yylval])dnl /* User initialization code. */
/* User initialization code. */ b4_user_initial_action
b4_user_initial_action b4_dollar_popdef])[]dnl
m4_popdef([b4_dollar_dollar])dnl
m4_popdef([b4_at_dollar])])dnl
[ /* Initialize the stacks. The initial state will be pushed in [ /* Initialize the stacks. The initial state will be pushed in
yynewstate, since the latter expects the semantical and the yynewstate, since the latter expects the semantical and the

View File

@@ -458,12 +458,10 @@ b4_lexer_if([[
yyerrstatus_ = 0; yyerrstatus_ = 0;
]m4_ifdef([b4_initial_action], [ ]m4_ifdef([b4_initial_action], [
m4_pushdef([b4_at_dollar], [yylloc])dnl b4_dollar_pushdef([yylval], [], [yylloc])dnl
m4_pushdef([b4_dollar_dollar], [yylval])dnl /* User initialization code. */
/* User initialization code. */ b4_user_initial_action
b4_user_initial_action b4_dollar_popdef])[]dnl
m4_popdef([b4_dollar_dollar])dnl
m4_popdef([b4_at_dollar])])dnl
[ /* Initialize the stack. */ [ /* Initialize the stack. */
yystack.push (yystate, yylval]b4_locations_if([, yylloc])[); yystack.push (yystate, yylval]b4_locations_if([, yylloc])[);

View File

@@ -1570,17 +1570,16 @@ b4_c_function_def([[yyparse]], [[int]], b4_parse_param)[
yylloc.first_column = yylloc.last_column = ]b4_location_initial_column[; yylloc.first_column = yylloc.last_column = ]b4_location_initial_column[;
#endif]]) #endif]])
m4_ifdef([b4_initial_action],[ m4_ifdef([b4_initial_action],[
m4_pushdef([b4_at_dollar], [m4_define([b4_at_dollar_used])yylloc])dnl b4_dollar_pushdef([m4_define([b4_dollar_dollar_used])yylval], [],
m4_pushdef([b4_dollar_dollar], [m4_define([b4_dollar_dollar_used])yylval])dnl [m4_define([b4_at_dollar_used])yylloc])dnl
/* User initialization code. */ /* User initialization code. */
b4_user_initial_action b4_user_initial_action
m4_popdef([b4_dollar_dollar])dnl b4_dollar_popdef[]dnl
m4_popdef([b4_at_dollar])])dnl
m4_ifdef([b4_dollar_dollar_used],[[ yyvsp[0] = yylval; m4_ifdef([b4_dollar_dollar_used],[[ yyvsp[0] = yylval;
]])dnl ]])dnl
m4_ifdef([b4_at_dollar_used], [[ yylsp[0] = yylloc; m4_ifdef([b4_at_dollar_used], [[ yylsp[0] = yylloc;
]])[ ]])])dnl
goto yysetstate; [ goto yysetstate;
/*------------------------------------------------------------. /*------------------------------------------------------------.
| yynewstate -- Push a new state, which is found in yystate. | | yynewstate -- Push a new state, which is found in yystate. |

View File

@@ -4552,9 +4552,9 @@ code.
@deffn {Directive} %initial-action @{ @var{code} @} @deffn {Directive} %initial-action @{ @var{code} @}
@findex %initial-action @findex %initial-action
Declare that the braced @var{code} must be invoked before parsing each time 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{yyparse} is called. The @var{code} may use @code{$$} (or
@code{@@$} --- initial value and location of the lookahead --- and the @code{$<@var{tag}>$}) and @code{@@$} --- initial value and location of the
@code{%parse-param}. lookahead --- and the @code{%parse-param}.
@end deffn @end deffn
For instance, if your locations use a file name, you may use For instance, if your locations use a file name, you may use

View File

@@ -1307,11 +1307,11 @@ AT_DATA_GRAMMAR([[input.y]],
} }
]])[ ]])[
// %initial-action %initial-action
// { {
// $<ival>$ = 42; $<ival>$ = 42;
// $<fval>$ = 4.2; $<fval>$ = 4.2;
// } }
%% %%
float: UNTYPED INT float: UNTYPED INT