tests: improve factoring of the main function

* tests/local.at (AT_MAIN_DEFINE): If %debug is used, check if
-d/--debug is passed to the generated parser, and enable the traces.
Return exactly the result of yyparse, so that we can check exit code
2 too.
* tests/actions.at, tests/glr-regression.at, tests/regression.at:
Use AT_MAIN_DEFINE, helping AT_BISON_OPTION_PUSHDEFS where needed,
preferably to option -t.
This commit is contained in:
Akim Demaille
2013-01-21 15:38:49 +01:00
parent 3ef9fa8f83
commit f42c012fcf
4 changed files with 61 additions and 117 deletions

View File

@@ -755,7 +755,7 @@ AT_CHECK_PRINTER_AND_DESTRUCTOR([%glr-parser], [with union])
# called for $end, and that $$ and @$ work correctly. # called for $end, and that $$ and @$ work correctly.
AT_SETUP([Default tagless %printer and %destructor]) AT_SETUP([Default tagless %printer and %destructor])
AT_BISON_OPTION_PUSHDEFS([%locations]) AT_BISON_OPTION_PUSHDEFS([%locations %debug])
AT_DATA_GRAMMAR([[input.y]], AT_DATA_GRAMMAR([[input.y]],
[[%define parse.error verbose [[%define parse.error verbose
%debug %debug
@@ -798,13 +798,7 @@ start: 'a' 'b' 'c' 'd' 'e' { $$ = 'S'; USE(($1, $2, $3, $4, $5)); } ;
%% %%
]AT_YYERROR_DEFINE[ ]AT_YYERROR_DEFINE[
]AT_YYLEX_DEFINE(["abcd"], [[yylval = res]])[ ]AT_YYLEX_DEFINE(["abcd"], [[yylval = res]])[
]AT_MAIN_DEFINE[
int
main (void)
{
yydebug = 1;
return yyparse ();
}
]]) ]])
AT_BISON_CHECK([-o input.c input.y], [], [], AT_BISON_CHECK([-o input.c input.y], [], [],
@@ -812,7 +806,7 @@ AT_BISON_CHECK([-o input.c input.y], [], [],
input.y:23.3-5: warning: useless %printer for type <*> [-Wother] input.y:23.3-5: warning: useless %printer for type <*> [-Wother]
]]) ]])
AT_COMPILE([input]) AT_COMPILE([input])
AT_PARSER_CHECK([./input], 1, AT_PARSER_CHECK([./input --debug], 1,
[[<> destructor for 'd' @ 4. [[<> destructor for 'd' @ 4.
'b'/'c' destructor for 'c' @ 3. 'b'/'c' destructor for 'c' @ 3.
'b'/'c' destructor for 'b' @ 2. 'b'/'c' destructor for 'b' @ 2.
@@ -856,7 +850,7 @@ AT_CLEANUP
## ------------------------------------------------------ ## ## ------------------------------------------------------ ##
AT_SETUP([Default tagged and per-type %printer and %destructor]) AT_SETUP([Default tagged and per-type %printer and %destructor])
AT_BISON_OPTION_PUSHDEFS AT_BISON_OPTION_PUSHDEFS([%debug])
AT_DATA_GRAMMAR([[input.y]], AT_DATA_GRAMMAR([[input.y]],
[[%define parse.error verbose [[%define parse.error verbose
%debug %debug
@@ -913,13 +907,7 @@ start:
%% %%
]AT_YYERROR_DEFINE[ ]AT_YYERROR_DEFINE[
]AT_YYLEX_DEFINE(["abcdef"])[ ]AT_YYLEX_DEFINE(["abcdef"])[
]AT_MAIN_DEFINE[
int
main (void)
{
yydebug = 1;
return yyparse ();
}
]]) ]])
AT_BISON_CHECK([-o input.c input.y], [], [], AT_BISON_CHECK([-o input.c input.y], [], [],
@@ -927,7 +915,7 @@ AT_BISON_CHECK([-o input.c input.y], [], [],
input.y:22.3-4: warning: useless %printer for type <> [-Wother] input.y:22.3-4: warning: useless %printer for type <> [-Wother]
]]) ]])
AT_COMPILE([input]) AT_COMPILE([input])
AT_PARSER_CHECK([./input], 1, AT_PARSER_CHECK([./input --debug], 1,
[[<*>/<field2>/e destructor. [[<*>/<field2>/e destructor.
<*>/<field2>/e destructor. <*>/<field2>/e destructor.
'd' destructor. 'd' destructor.
@@ -991,7 +979,7 @@ m4_pushdef([AT_TEST],
[m4_pushdef([kind], []) m4_pushdef([not_kind], [*])], [m4_pushdef([kind], []) m4_pushdef([not_kind], [*])],
[m4_pushdef([kind], [*]) m4_pushdef([not_kind], [])]) [m4_pushdef([kind], [*]) m4_pushdef([not_kind], [])])
AT_BISON_OPTION_PUSHDEFS([%locations]) AT_BISON_OPTION_PUSHDEFS([%locations %debug])
AT_DATA_GRAMMAR([[input]]$1[[.y]], AT_DATA_GRAMMAR([[input]]$1[[.y]],
[[%define parse.error verbose [[%define parse.error verbose
%debug %debug
@@ -1044,13 +1032,7 @@ yylex (void)
return 0; return 0;
} }
]AT_YYERROR_DEFINE[ ]AT_YYERROR_DEFINE[
]AT_MAIN_DEFINE[
int
main (void)
{
yydebug = 1;
return yyparse ();
}
]]) ]])
AT_BISON_OPTION_POPDEFS AT_BISON_OPTION_POPDEFS
@@ -1065,7 +1047,7 @@ input1.y:23.3-4: warning: useless %printer for type <> [-Wother]
AT_COMPILE([input$1]) AT_COMPILE([input$1])
AT_PARSER_CHECK([./input$1], 0, AT_PARSER_CHECK([./input$1 --debug], 0,
[[<]]kind[[> for 'E' @ 1. [[<]]kind[[> for 'E' @ 1.
<]]kind[[> for 'S' @ 1. <]]kind[[> for 'S' @ 1.
]], ]],
@@ -1110,7 +1092,7 @@ AT_SETUP([Default %printer and %destructor are not for error or $undefined])
# semantic value, which would be initialized from the lookahead, which # semantic value, which would be initialized from the lookahead, which
# would be destroyed separately. # would be destroyed separately.
# - For $undefined, who knows what the semantic value would be. # - For $undefined, who knows what the semantic value would be.
AT_BISON_OPTION_PUSHDEFS AT_BISON_OPTION_PUSHDEFS([%debug])
AT_DATA_GRAMMAR([[input.y]], AT_DATA_GRAMMAR([[input.y]],
[[%debug [[%debug
@@ -1141,12 +1123,7 @@ start:
%% %%
]AT_YYERROR_DEFINE[ ]AT_YYERROR_DEFINE[
]AT_YYLEX_DEFINE(["abd"], [yylval = res])[ ]AT_YYLEX_DEFINE(["abd"], [yylval = res])[
int ]AT_MAIN_DEFINE[
main (void)
{
yydebug = 1;
return yyparse ();
}
]]) ]])
AT_BISON_OPTION_POPDEFS AT_BISON_OPTION_POPDEFS
@@ -1155,7 +1132,7 @@ AT_BISON_CHECK([-o input.c input.y], [], [],
input.y:21.6-8: warning: useless %printer for type <*> [-Wother] input.y:21.6-8: warning: useless %printer for type <*> [-Wother]
]]) ]])
AT_COMPILE([input]) AT_COMPILE([input])
AT_PARSER_CHECK([./input], [1], [], AT_PARSER_CHECK([./input --debug], [1], [],
[[Starting parse [[Starting parse
Entering state 0 Entering state 0
Reading a token: Next token is token 'a' ('a') Reading a token: Next token is token 'a' ('a')
@@ -1213,7 +1190,7 @@ AT_SETUP([Default %printer and %destructor are not for $accept])
# true for $undefined and the error token, so there are three warnings for # true for $undefined and the error token, so there are three warnings for
# %printer and three for %destructor.) # %printer and three for %destructor.)
AT_BISON_OPTION_PUSHDEFS AT_BISON_OPTION_PUSHDEFS([%debug])
AT_DATA_GRAMMAR([[input.y]], AT_DATA_GRAMMAR([[input.y]],
[[%debug /* So that %printer is actually compiled. */ [[%debug /* So that %printer is actually compiled. */
@@ -1264,7 +1241,7 @@ AT_CLEANUP
AT_SETUP([Default %printer and %destructor for mid-rule values]) AT_SETUP([Default %printer and %destructor for mid-rule values])
AT_BISON_OPTION_PUSHDEFS AT_BISON_OPTION_PUSHDEFS([%debug])
AT_DATA_GRAMMAR([[input.y]], AT_DATA_GRAMMAR([[input.y]],
[[%debug /* So that %printer is actually compiled. */ [[%debug /* So that %printer is actually compiled. */
@@ -1298,12 +1275,7 @@ start:
%% %%
]AT_YYERROR_DEFINE[ ]AT_YYERROR_DEFINE[
]AT_YYLEX_DEFINE[ ]AT_YYLEX_DEFINE[
int ]AT_MAIN_DEFINE[
main (void)
{
yydebug = 1;
return yyparse ();
}
]]) ]])
AT_BISON_OPTION_POPDEFS AT_BISON_OPTION_POPDEFS
@@ -1330,7 +1302,7 @@ input.y:32.3-23: warning: unused value: $3 [-Wother]
]]) ]])
AT_COMPILE([input]) AT_COMPILE([input])
AT_PARSER_CHECK([./input], 1,, AT_PARSER_CHECK([./input --debug], 1,,
[[Starting parse [[Starting parse
Entering state 0 Entering state 0
Reducing stack by rule 1 (line 30): Reducing stack by rule 1 (line 30):
@@ -1379,7 +1351,7 @@ AT_CLEANUP
# ------------------------------------------- # -------------------------------------------
m4_define([AT_CHECK_ACTION_LOCATIONS], m4_define([AT_CHECK_ACTION_LOCATIONS],
[AT_SETUP([[@$ in ]$1[ implies %locations]]) [AT_SETUP([[@$ in ]$1[ implies %locations]])
AT_BISON_OPTION_PUSHDEFS AT_BISON_OPTION_PUSHDEFS([%debug])
AT_DATA_GRAMMAR([[input.y]], AT_DATA_GRAMMAR([[input.y]],
[[%code { [[%code {
#include <stdio.h> #include <stdio.h>
@@ -1438,7 +1410,7 @@ AT_CHECK_ACTION_LOCATIONS([[%printer]])
m4_pushdef([AT_TEST], m4_pushdef([AT_TEST],
[AT_SETUP([[Qualified $$ in actions: $1]]) [AT_SETUP([[Qualified $$ in actions: $1]])
AT_BISON_OPTION_PUSHDEFS([%skeleton "$1"]) AT_BISON_OPTION_PUSHDEFS([%skeleton "$1" %debug])
AT_DATA_GRAMMAR([[input.y]], AT_DATA_GRAMMAR([[input.y]],
[[%skeleton "$1" [[%skeleton "$1"
@@ -1502,19 +1474,11 @@ float: UNTYPED INT
EOF}]], EOF}]],
[[{UNTYPED, INT, EOF}]]), [[{UNTYPED, INT, EOF}]]),
[AT_VAL.ival = toknum * 10; AT_VAL.fval = toknum / 10.0;])[ [AT_VAL.ival = toknum * 10; AT_VAL.fval = toknum / 10.0;])[
int ]AT_MAIN_DEFINE[
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_FULL_COMPILE([[input]])
AT_PARSER_CHECK([./input], 0, [], [stderr]) AT_PARSER_CHECK([./input --debug], 0, [], [stderr])
# Don't be too picky on the traces, GLR is not exactly the same. Keep # Don't be too picky on the traces, GLR is not exactly the same. Keep
# only the lines from the printer. # only the lines from the printer.
AT_CHECK([[sed -ne '/ival:/p' stderr]], 0, AT_CHECK([[sed -ne '/ival:/p' stderr]], 0,
@@ -1710,7 +1674,7 @@ AT_CLEANUP
AT_SETUP([[YYBACKUP]]) AT_SETUP([[YYBACKUP]])
AT_BISON_OPTION_PUSHDEFS([%pure-parser]) AT_BISON_OPTION_PUSHDEFS([%pure-parser %debug])
AT_DATA_GRAMMAR([input.y], AT_DATA_GRAMMAR([input.y],
[[ [[

View File

@@ -1658,7 +1658,7 @@ AT_CLEANUP
AT_SETUP([Ambiguity reports]) AT_SETUP([Ambiguity reports])
AT_BISON_OPTION_PUSHDEFS AT_BISON_OPTION_PUSHDEFS([%debug])
AT_DATA_GRAMMAR([input.y], AT_DATA_GRAMMAR([input.y],
[[ [[
%{ %{
@@ -1681,12 +1681,7 @@ d: /* nada. */;
%% %%
]AT_YYLEX_DEFINE(["abc"])[ ]AT_YYLEX_DEFINE(["abc"])[
]AT_YYERROR_DEFINE[ ]AT_YYERROR_DEFINE[
int ]AT_MAIN_DEFINE[
main (void)
{
yydebug = 1;
return !!yyparse ();
}
]]) ]])
AT_BISON_OPTION_POPDEFS AT_BISON_OPTION_POPDEFS
@@ -1695,7 +1690,7 @@ AT_BISON_CHECK([[-o input.c input.y]], 0, [],
]]) ]])
AT_COMPILE([input]) AT_COMPILE([input])
AT_PARSER_CHECK([[./input]], 1, [], AT_PARSER_CHECK([[./input --debug]], 1, [],
[Starting parse [Starting parse
Entering state 0 Entering state 0
Reading a token: Next token is token 'a' () Reading a token: Next token is token 'a' ()

View File

@@ -452,20 +452,32 @@ m4_define([AT_MAIN_DEFINE],
[m4_case(AT_LANG, [m4_case(AT_LANG,
[c], [c],
[[#include <stdlib.h> /* getenv. */ [[#include <stdlib.h> /* getenv. */
#include <string.h> /* strcmp. */
int int
main (void) main (int argc, char const* argv[])
{]AT_DEBUG_IF([ {]AT_DEBUG_IF([[
yydebug = !!getenv("YYDEBUG");])[ if (getenv("YYDEBUG")
return !!yyparse (); || (argc == 2
&& (!strcmp (argv[1], "-d") || !strcmp (argv[1], "--debug"))))
yydebug |= 1;]], [[
(void) argc;
(void) argv;]])[
return yyparse ();
}]], }]],
[c++], [c++],
[[#include <cstdlib> // getenv. [[#include <cstdlib> // getenv.
#include <cstring> // strcmp.
int int
main (void) main (int argc, char const* argv[])
{ {
yy::parser p;]AT_DEBUG_IF([ yy::parser p;]AT_DEBUG_IF([[
p.set_debug_level (!!getenv("YYDEBUG"));])[ if (getenv("YYDEBUG")
return !!p.parse (); || (argc == 2
&& (!strcmp (argv[1], "-d") || !strcmp (argv[1], "--debug"))))
p.set_debug_level (true);]], [[
(void) argc;
(void) argv;]])[
return p.parse ();
}]], }]],
[java], [java],
[[class input [[class input

View File

@@ -883,17 +883,6 @@ member: STRING
%% %%
]AT_YYERROR_DEFINE[ ]AT_YYERROR_DEFINE[
]AT_YYLEX_DEFINE([":"])[ ]AT_YYLEX_DEFINE([":"])[
]AT_LALR1_CC_IF(
[int
yyparse ()
{
yy::parser parser;
#if YYDEBUG
parser.set_debug_level (YYDEBUG);
#endif
return parser.parse ();
}
])[
]AT_MAIN_DEFINE[ ]AT_MAIN_DEFINE[
]]) ]])
])# _AT_DATA_DANCER_Y ])# _AT_DATA_DANCER_Y
@@ -1007,14 +996,14 @@ AT_SETUP([Braced code in declaration in rules section])
# Bison once mistook braced code in a declaration in the rules section to be a # Bison once mistook braced code in a declaration in the rules section to be a
# rule action. # rule action.
AT_BISON_OPTION_PUSHDEFS AT_BISON_OPTION_PUSHDEFS([%debug])
AT_DATA_GRAMMAR([input.y], AT_DATA_GRAMMAR([input.y],
[[%{ [[%{
#include <stdio.h> #include <stdio.h>
]AT_YYERROR_DECLARE[ ]AT_YYERROR_DECLARE[
]AT_YYLEX_DECLARE[ ]AT_YYLEX_DECLARE[
%} %}
%debug
%error-verbose %error-verbose
%% %%
@@ -1032,19 +1021,13 @@ start:
%% %%
]AT_YYERROR_DEFINE[ ]AT_YYERROR_DEFINE[
]AT_YYLEX_DEFINE(["a"])[ ]AT_YYLEX_DEFINE(["a"])[
]AT_MAIN_DEFINE[
int
main (void)
{
yydebug = 1;
return !yyparse ();
}
]]) ]])
AT_BISON_OPTION_POPDEFS AT_BISON_OPTION_POPDEFS
AT_BISON_CHECK([-t -o input.c input.y]) AT_BISON_CHECK([-o input.c input.y])
AT_COMPILE([input]) AT_COMPILE([input])
AT_PARSER_CHECK([./input], 0, AT_PARSER_CHECK([./input --debug], 1,
[[Bison would once convert this action to a midrule because of the subsequent braced code. [[Bison would once convert this action to a midrule because of the subsequent braced code.
]], ]],
[[Starting parse [[Starting parse
@@ -1083,7 +1066,7 @@ start: 'a' "A" 'b';
%token 'a' "A"; %token 'a' "A";
]]) ]])
AT_BISON_CHECK([-t -o input.c input.y]) AT_BISON_CHECK([-o input.c input.y])
AT_CLEANUP AT_CLEANUP
@@ -1399,7 +1382,7 @@ AT_SETUP([[LAC: Exploratory stack]])
m4_pushdef([AT_LAC_CHECK], [ m4_pushdef([AT_LAC_CHECK], [
AT_BISON_OPTION_PUSHDEFS([$1]) AT_BISON_OPTION_PUSHDEFS([%debug $1])
AT_DATA_GRAMMAR([input.y], AT_DATA_GRAMMAR([input.y],
[[%code { [[%code {
@@ -1407,7 +1390,7 @@ AT_DATA_GRAMMAR([input.y],
]AT_YYERROR_DECLARE[ ]AT_YYERROR_DECLARE[
int yylex (]AT_PURE_IF([[YYSTYPE *]], [[void]])[); int yylex (]AT_PURE_IF([[YYSTYPE *]], [[void]])[);
} }
%debug
]$1[ ]$1[
%define parse.error verbose %define parse.error verbose
%token 'c' %token 'c'
@@ -1434,21 +1417,16 @@ yylex (]AT_PURE_IF([[YYSTYPE *v]], [[void]])[)
return *input++; return *input++;
} }
int ]AT_MAIN_DEFINE[
main (void)
{
yydebug = 1;
return yyparse ();
}
]]) ]])
AT_BISON_CHECK([[-Dparse.lac=full -Dparse.lac.es-capacity-initial=1 \ AT_BISON_CHECK([[-Dparse.lac=full -Dparse.lac.es-capacity-initial=1 \
-Dparse.lac.memory-trace=full \ -Dparse.lac.memory-trace=full \
-t -o input.c input.y]], [[0]], [], -o input.c input.y]], [[0]], [],
[[input.y: warning: 21 shift/reduce conflicts [-Wconflicts-sr] [[input.y: warning: 21 shift/reduce conflicts [-Wconflicts-sr]
]]) ]])
AT_COMPILE([[input]]) AT_COMPILE([[input]])
AT_PARSER_CHECK([[./input > stdout.txt 2> stderr.txt]], [[1]]) AT_PARSER_CHECK([[./input --debug > stdout.txt 2> stderr.txt]], [[1]])
# Make sure syntax error doesn't forget that 'a' is expected. It would # Make sure syntax error doesn't forget that 'a' is expected. It would
# be forgotten without lookahead correction. # be forgotten without lookahead correction.
@@ -1492,7 +1470,7 @@ AT_CLEANUP
AT_SETUP([[LAC: Memory exhaustion]]) AT_SETUP([[LAC: Memory exhaustion]])
m4_pushdef([AT_LAC_CHECK], m4_pushdef([AT_LAC_CHECK],
[AT_BISON_OPTION_PUSHDEFS [AT_BISON_OPTION_PUSHDEFS([%debug])
AT_DATA_GRAMMAR([input.y], AT_DATA_GRAMMAR([input.y],
[[%code { [[%code {
#include <stdio.h> #include <stdio.h>
@@ -1500,7 +1478,7 @@ AT_DATA_GRAMMAR([input.y],
]AT_YYLEX_DECLARE[ ]AT_YYLEX_DECLARE[
#define YYMAXDEPTH 8 #define YYMAXDEPTH 8
} }
%debug
%error-verbose %error-verbose
%% %%
@@ -1511,16 +1489,11 @@ A: /*empty*/ | 'a' ;
%% %%
]AT_YYERROR_DEFINE[ ]AT_YYERROR_DEFINE[
]AT_YYLEX_DEFINE(["$1"])[ ]AT_YYLEX_DEFINE(["$1"])[
int ]AT_MAIN_DEFINE[
main (void)
{
yydebug = 1;
return yyparse ();
}
]]) ]])
AT_BISON_CHECK([[-Dparse.lac=full -Dparse.lac.es-capacity-initial=1 \ AT_BISON_CHECK([[-Dparse.lac=full -Dparse.lac.es-capacity-initial=1 \
-t -o input.c input.y]], [[0]], [], -o input.c input.y]], [[0]], [],
[[input.y: warning: 8 shift/reduce conflicts [-Wconflicts-sr] [[input.y: warning: 8 shift/reduce conflicts [-Wconflicts-sr]
]]) ]])
AT_COMPILE([[input]]) AT_COMPILE([[input]])
@@ -1529,7 +1502,7 @@ AT_BISON_OPTION_POPDEFS
# Check for memory exhaustion during parsing. # Check for memory exhaustion during parsing.
AT_LAC_CHECK([]) AT_LAC_CHECK([])
AT_PARSER_CHECK([[./input]], [[2]], [], AT_PARSER_CHECK([[./input --debug]], [[2]], [],
[[Starting parse [[Starting parse
Entering state 0 Entering state 0
Reading a token: Now at end of input. Reading a token: Now at end of input.
@@ -1543,7 +1516,7 @@ Stack now 0
# Induce an immediate syntax error with an undefined token, and check # Induce an immediate syntax error with an undefined token, and check
# for memory exhaustion while building syntax error message. # for memory exhaustion while building syntax error message.
AT_LAC_CHECK([z], [[0]]) AT_LAC_CHECK([z], [[0]])
AT_PARSER_CHECK([[./input]], [[2]], [], AT_PARSER_CHECK([[./input --debug]], [[2]], [],
[[Starting parse [[Starting parse
Entering state 0 Entering state 0
Reading a token: Next token is token $undefined () Reading a token: Next token is token $undefined ()