mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-17 16:23:04 +00:00
Merge remote-tracking branch 'origin/maint'
* origin/maint: (29 commits) regen synclines: remove spurious empty line also support $<foo>$ in the %initial-action skeletons: b4_dollar_pushdef and popdef to simpify complex definitions regen printer/destructor: translate only once factor the handling of m4 escaping news: schedule the removal of the ";" hack style changes in the scanners regen support $<tag>$ in printers and destructors scan-code: factor the handling of the type in $<TYPE>$ muscles: fix another occurrence of unescaped type name glr.cc: fix the handling of yydebug gnulib: update formatting changes tests: fix an assertion tests: adjust to GCC 4.8, which displays caret errors be sure to properly escape type names obstack_quote: escape and quote for M4 muscles: shuffle responsabilities muscles: make private functions static muscles: rename private functions/macros obstack_escape: escape M4 characters remove dead macro maint: style changes doc: avoid problems with case insensitive file systems configure: fix botched quoting news: fix typo. Conflicts: NEWS data/c.m4 data/glr.cc data/lalr1.cc examples/rpcalc/local.mk src/muscle-tab.h src/output.c src/parse-gram.c src/parse-gram.h src/parse-gram.y src/scan-code.l src/symlist.c src/symlist.h src/symtab.h tests/calc.at
This commit is contained in:
137
tests/actions.at
137
tests/actions.at
@@ -1255,6 +1255,143 @@ AT_CHECK_ACTION_LOCATIONS([[%destructor]])
|
||||
AT_CHECK_ACTION_LOCATIONS([[%printer]])
|
||||
|
||||
|
||||
## ------------------------- ##
|
||||
## Qualified $$ in actions. ##
|
||||
## ------------------------- ##
|
||||
|
||||
# Check that we can used qualified $$ (v.g., $<type>$) not only in
|
||||
# rule actions, but also where $$ is valid: %printer and %destructor.
|
||||
#
|
||||
# FIXME: Not actually checking %desctructor, but it's the same code as
|
||||
# %printer...
|
||||
#
|
||||
# To do that, use a semantic value that has two fields (sem_type),
|
||||
# declare symbols to have only one of these types (INT, float), and
|
||||
# use $<type>$ to get the other one. Including for symbols that are
|
||||
# not typed (UNTYPED).
|
||||
|
||||
m4_pushdef([AT_TEST],
|
||||
[AT_SETUP([[Qualified $$ in actions: $1]])
|
||||
|
||||
AT_BISON_OPTION_PUSHDEFS([%locations %skeleton "$1"])
|
||||
|
||||
AT_DATA_GRAMMAR([[input.y]],
|
||||
[[%skeleton "$1"
|
||||
%defines // FIXME: Mandated by lalr1.cc in Bison 2.6.
|
||||
%locations // FIXME: Mandated by lalr1.cc in Bison 2.6.
|
||||
%debug
|
||||
%code requires
|
||||
{
|
||||
# include <stdio.h>
|
||||
|
||||
typedef struct sem_type
|
||||
{
|
||||
int ival;
|
||||
float fval;
|
||||
} sem_type;
|
||||
|
||||
# define YYSTYPE sem_type
|
||||
|
||||
#ifdef __cplusplus
|
||||
# include <iostream>
|
||||
static void
|
||||
report (std::ostream& yyo, int ival, float fval)
|
||||
{
|
||||
yyo << "ival: " << ival << ", fval: " << fval;
|
||||
}
|
||||
#else
|
||||
static void
|
||||
report (FILE* yyo, int ival, float fval)
|
||||
{
|
||||
fprintf (yyo, "ival: %d, fval: %1.1f", ival, fval);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
%code
|
||||
{
|
||||
]AT_YYERROR_DECLARE[
|
||||
]AT_YYLEX_DECLARE[
|
||||
}
|
||||
|
||||
%token UNTYPED
|
||||
%token <ival> INT
|
||||
%type <fval> float
|
||||
%printer { report (yyo, $$, $<fval>$); } <ival>;
|
||||
%printer { report (yyo, $<ival>$, $$ ); } <fval>;
|
||||
%printer { report (yyo, $<ival>$, $<fval>$); } <>;
|
||||
|
||||
]AT_SKEL_CC_IF([[
|
||||
/* The lalr1.cc skeleton, for backward compatibility, defines
|
||||
a constructor for position that initializes the filename. The
|
||||
glr.cc skeleton does not (and in fact cannot: location/position
|
||||
are stored in a union, from which objects with constructors are
|
||||
excluded in C++). */
|
||||
%initial-action {
|
||||
@$.initialize ();
|
||||
}
|
||||
]])[
|
||||
|
||||
%initial-action
|
||||
{
|
||||
$<ival>$ = 42;
|
||||
$<fval>$ = 4.2;
|
||||
}
|
||||
|
||||
%%
|
||||
float: UNTYPED INT
|
||||
{
|
||||
$$ = $<fval>1 + $<fval>2;
|
||||
$<ival>$ = $<ival>1 + $][2;
|
||||
};
|
||||
%%
|
||||
]AT_YYERROR_DEFINE[
|
||||
]AT_YYLEX_DEFINE(AT_SKEL_CC_IF([[{yy::parser::token::UNTYPED,
|
||||
yy::parser::token::INT,
|
||||
EOF}]],
|
||||
[[{UNTYPED, INT, EOF}]]),
|
||||
[AT_VAL.ival = toknum * 10; AT_VAL.fval = toknum / 10.0;])[
|
||||
int
|
||||
main (void)
|
||||
{]AT_SKEL_CC_IF([[
|
||||
yy::parser p;
|
||||
p.set_debug_level(1);
|
||||
return p.parse ();]], [[
|
||||
yydebug = 1;
|
||||
return yyparse ();]])[
|
||||
}
|
||||
]])
|
||||
|
||||
AT_FULL_COMPILE([[input]])
|
||||
AT_PARSER_CHECK([./input], 0, [], [stderr])
|
||||
# Don't be too picky on the traces, GLR is not exactly the same. Keep
|
||||
# only the lines from the printer.
|
||||
#
|
||||
# Don't care about locations. FIXME: remove their removal when Bison
|
||||
# supports C++ without locations.
|
||||
AT_CHECK([[sed -ne 's/([-0-9.]*: /(/;/ival:/p' stderr]], 0,
|
||||
[[Reading a token: Next token is token UNTYPED (ival: 10, fval: 0.1)
|
||||
Shifting token UNTYPED (ival: 10, fval: 0.1)
|
||||
Reading a token: Next token is token INT (ival: 20, fval: 0.2)
|
||||
Shifting token INT (ival: 20, fval: 0.2)
|
||||
$][1 = token UNTYPED (ival: 10, fval: 0.1)
|
||||
$][2 = token INT (ival: 20, fval: 0.2)
|
||||
-> $$ = nterm float (ival: 30, fval: 0.3)
|
||||
Cleanup: popping nterm float (ival: 30, fval: 0.3)
|
||||
]])
|
||||
|
||||
AT_BISON_OPTION_POPDEFS
|
||||
|
||||
AT_CLEANUP
|
||||
])
|
||||
|
||||
AT_TEST([yacc.c])
|
||||
AT_TEST([glr.c])
|
||||
AT_TEST([lalr1.cc])
|
||||
AT_TEST([glr.cc])
|
||||
|
||||
m4_popdef([AT_TEST])
|
||||
|
||||
## ----------------------------------------------- ##
|
||||
## Fix user actions without a trailing semicolon. ##
|
||||
## ----------------------------------------------- ##
|
||||
|
||||
@@ -1491,3 +1491,102 @@ AT_TEST([%define api.prefix foo], [-p bar], [input.y:1.9-18])
|
||||
m4_popdef([AT_TEST])
|
||||
|
||||
AT_CLEANUP
|
||||
|
||||
|
||||
## -------------- ##
|
||||
## Stray $ or @. ##
|
||||
## -------------- ##
|
||||
|
||||
AT_SETUP([[Stray $ or @]])
|
||||
|
||||
# Give %printer and %destructor "<*> exp TOK" instead of "<*>" to
|
||||
# check that the warnings are reported once, not three times.
|
||||
|
||||
AT_DATA_GRAMMAR([[input.y]],
|
||||
[[%type <TYPE> exp
|
||||
%token <TYPE> TOK TOK2
|
||||
%destructor { $%; @%; } <*> exp TOK;
|
||||
%initial-action { $%; @%; };
|
||||
%printer { $%; @%; } <*> exp TOK;
|
||||
%%
|
||||
exp: TOK { $%; @%; $$ = $1; };
|
||||
]])
|
||||
|
||||
AT_BISON_CHECK([[input.y]], 0, [],
|
||||
[[input.y:11.19: warning: stray '$' [-Wother]
|
||||
input.y:11.23: warning: stray '@' [-Wother]
|
||||
input.y:12.19: warning: stray '$' [-Wother]
|
||||
input.y:12.23: warning: stray '@' [-Wother]
|
||||
input.y:13.19: warning: stray '$' [-Wother]
|
||||
input.y:13.23: warning: stray '@' [-Wother]
|
||||
input.y:15.19: warning: stray '$' [-Wother]
|
||||
input.y:15.23: warning: stray '@' [-Wother]
|
||||
]])
|
||||
|
||||
AT_CLEANUP
|
||||
|
||||
|
||||
|
||||
## ---------------- ##
|
||||
## Code injection. ##
|
||||
## ---------------- ##
|
||||
|
||||
|
||||
AT_SETUP([[Code injection]])
|
||||
|
||||
m4_pattern_allow([^m4_errprintn$])
|
||||
|
||||
# AT_TEST([MACRO])
|
||||
# ----------------
|
||||
# Try to have MACRO be run by bison.
|
||||
m4_pushdef([AT_TEST],
|
||||
[AT_DATA([[input.y]],
|
||||
[[%type <$1(DEAD %type)> exp
|
||||
%token <$1(DEAD %token)> a
|
||||
%token b
|
||||
%initial-action
|
||||
{
|
||||
$$;
|
||||
$<$1(DEAD %initial-action)>$
|
||||
};
|
||||
%printer
|
||||
{
|
||||
$$
|
||||
$<$1(DEAD %printer)>$
|
||||
} <> <*>;
|
||||
%lex-param
|
||||
{
|
||||
$1(DEAD %lex-param)
|
||||
};
|
||||
%parse-param
|
||||
{
|
||||
$1(DEAD %parse-param)
|
||||
};
|
||||
%%
|
||||
exp:
|
||||
a a[name] b
|
||||
{
|
||||
$$;
|
||||
$][1;
|
||||
$<$1(DEAD action 1)>$
|
||||
$<$1(DEAD action 2)>1
|
||||
$<$1(DEAD action 3)>name
|
||||
$<$1(DEAD action 4)>0
|
||||
;
|
||||
};
|
||||
]])
|
||||
|
||||
# FIXME: Provide a means to iterate over all the skeletons.
|
||||
AT_BISON_CHECK([[-d input.y]])
|
||||
AT_BISON_CHECK([[-d -S glr.c input.y]])
|
||||
AT_BISON_CHECK([[-d -S lalr1.cc input.y]])
|
||||
AT_BISON_CHECK([[-d -S glr.cc input.y]])
|
||||
AT_BISON_CHECK([[ -S lalr1.java input.y]])
|
||||
])
|
||||
|
||||
AT_TEST([m4_errprintn])
|
||||
AT_TEST([@:>@m4_errprintn])
|
||||
|
||||
m4_popdef([AT_TEST])
|
||||
|
||||
AT_CLEANUP
|
||||
|
||||
@@ -338,7 +338,7 @@ static
|
||||
static size_t toknum = 0;
|
||||
int res;
|
||||
]AT_USE_LEX_ARGS[;
|
||||
assert (toknum < sizeof input);
|
||||
assert (toknum < sizeof input / sizeof input[0]);
|
||||
res = input[toknum++];
|
||||
]$2[;]AT_LOCATION_IF([[
|
||||
]AT_LOC_FIRST_LINE[ = ]AT_LOC_LAST_LINE[ = 1;
|
||||
|
||||
@@ -27,6 +27,11 @@ AT_BANNER([[User Actions.]])
|
||||
# errors.
|
||||
m4_define([AT_SYNCLINES_COMPILE],
|
||||
[AT_CHECK([$CC $CFLAGS $CPPFLAGS -c $1], [ignore], [], [stderr])
|
||||
|
||||
# Transform stderr into something like this:
|
||||
#
|
||||
# input.y:4: #error "4"
|
||||
#
|
||||
# In case GCC displays column information, strip it down.
|
||||
#
|
||||
# input.y:4:2: #error "4" or
|
||||
@@ -42,6 +47,11 @@ m4_define([AT_SYNCLINES_COMPILE],
|
||||
# =>
|
||||
# input.y:4: #error "8"
|
||||
#
|
||||
# The message may include a caret-error:
|
||||
#
|
||||
# input.y:1:2: error: #error "1"
|
||||
# #error "1"
|
||||
# ^
|
||||
#
|
||||
# And possibly distcc adds its bits.
|
||||
#
|
||||
@@ -54,12 +64,15 @@ m4_define([AT_SYNCLINES_COMPILE],
|
||||
# distcc[35882] (dcc_connect_by_name) ERROR: failed to look up host "chrisimac": Unknown host
|
||||
# distcc[35882] Warning: failed to distribute input.c to chrisimac/4, running locally instead
|
||||
|
||||
AT_CHECK([[sed -e '/^distcc\[[0-9]*\] /d' \
|
||||
-e 's/^\([^:]*:[^:.]*\)[.:][^:]*:\(.*\)$/\1:\2/' \
|
||||
-e 's/^\([^:]*:[^:]*:\)[^@%:@]*\( @%:@error\)/\1\2/' \
|
||||
-e "/^[^:]*: In function '[^\']*':$/d" \
|
||||
stderr]],
|
||||
0, [stdout])
|
||||
AT_CHECK([[perl -p -0777 -f - stderr <<\EOF
|
||||
s/^distcc\[\d+\] .*\n//gm;
|
||||
s/^([^:]*:\d+)[.:][^:]*:(.*)$/$][1:$][2/gm;
|
||||
s/^([^:]*:\d+:)[^#]*( #error)/$][1$][2/gm;
|
||||
s/^[^:]*: In function '[^']*':\n//gm;
|
||||
s/^\ +#error.*\n\ *\^\n//gm;
|
||||
EOF
|
||||
]],
|
||||
0, [stdout])
|
||||
])
|
||||
|
||||
# AT_TEST_SYNCLINE(TITLE, INPUT, ERROR-MSG)
|
||||
|
||||
Reference in New Issue
Block a user