mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-18 08:43:03 +00:00
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:
6
NEWS
6
NEWS
@@ -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]
|
||||||
|
|
||||||
|
|||||||
@@ -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
44
data/c-like.m4
Normal 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
|
||||||
|
])
|
||||||
29
data/c.m4
29
data/c.m4
@@ -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;
|
||||||
|
|||||||
10
data/glr.c
10
data/glr.c
@@ -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;
|
||||||
|
|||||||
@@ -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)
|
||||||
# ----------------
|
# ----------------
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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])[);
|
||||||
|
|||||||
11
data/yacc.c
11
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[;
|
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. |
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user