* 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.
# called for $end, and that $$ and @$ work correctly.
AT_SETUP([Default tagless %printer and %destructor])
# called for $end, and that $$ and @$ work correctly.
AT_SETUP([Default tagless %printer and %destructor])
-AT_BISON_OPTION_PUSHDEFS([%locations])
+AT_BISON_OPTION_PUSHDEFS([%locations %debug])
AT_DATA_GRAMMAR([[input.y]],
[[%define parse.error verbose
%debug
AT_DATA_GRAMMAR([[input.y]],
[[%define parse.error verbose
%debug
%%
]AT_YYERROR_DEFINE[
]AT_YYLEX_DEFINE(["abcd"], [[yylval = res]])[
%%
]AT_YYERROR_DEFINE[
]AT_YYLEX_DEFINE(["abcd"], [[yylval = res]])[
-
-int
-main (void)
-{
- yydebug = 1;
- return yyparse ();
-}
]])
AT_BISON_CHECK([-o input.c input.y], [], [],
]])
AT_BISON_CHECK([-o input.c input.y], [], [],
input.y:23.3-5: warning: useless %printer for type <*> [-Wother]
]])
AT_COMPILE([input])
input.y:23.3-5: warning: useless %printer for type <*> [-Wother]
]])
AT_COMPILE([input])
-AT_PARSER_CHECK([./input], 1,
+AT_PARSER_CHECK([./input --debug], 1,
[[<> destructor for 'd' @ 4.
'b'/'c' destructor for 'c' @ 3.
'b'/'c' destructor for 'b' @ 2.
[[<> destructor for 'd' @ 4.
'b'/'c' destructor for 'c' @ 3.
'b'/'c' destructor for 'b' @ 2.
## ------------------------------------------------------ ##
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]],
[[%define parse.error verbose
%debug
AT_DATA_GRAMMAR([[input.y]],
[[%define parse.error verbose
%debug
%%
]AT_YYERROR_DEFINE[
]AT_YYLEX_DEFINE(["abcdef"])[
%%
]AT_YYERROR_DEFINE[
]AT_YYLEX_DEFINE(["abcdef"])[
-
-int
-main (void)
-{
- yydebug = 1;
- return yyparse ();
-}
]])
AT_BISON_CHECK([-o input.c input.y], [], [],
]])
AT_BISON_CHECK([-o input.c input.y], [], [],
input.y:22.3-4: warning: useless %printer for type <> [-Wother]
]])
AT_COMPILE([input])
input.y:22.3-4: warning: useless %printer for type <> [-Wother]
]])
AT_COMPILE([input])
-AT_PARSER_CHECK([./input], 1,
+AT_PARSER_CHECK([./input --debug], 1,
[[<*>/<field2>/e destructor.
<*>/<field2>/e destructor.
'd' destructor.
[[<*>/<field2>/e destructor.
<*>/<field2>/e destructor.
'd' destructor.
[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]],
[[%define parse.error verbose
%debug
AT_DATA_GRAMMAR([[input]]$1[[.y]],
[[%define parse.error verbose
%debug
return 0;
}
]AT_YYERROR_DEFINE[
return 0;
}
]AT_YYERROR_DEFINE[
-
-int
-main (void)
-{
- yydebug = 1;
- return yyparse ();
-}
]])
AT_BISON_OPTION_POPDEFS
]])
AT_BISON_OPTION_POPDEFS
-AT_PARSER_CHECK([./input$1], 0,
+AT_PARSER_CHECK([./input$1 --debug], 0,
[[<]]kind[[> for 'E' @ 1.
<]]kind[[> for 'S' @ 1.
]],
[[<]]kind[[> for 'E' @ 1.
<]]kind[[> for 'S' @ 1.
]],
# semantic value, which would be initialized from the lookahead, which
# would be destroyed separately.
# - For $undefined, who knows what the semantic value would be.
# semantic value, which would be initialized from the lookahead, which
# would be destroyed separately.
# - For $undefined, who knows what the semantic value would be.
-AT_BISON_OPTION_PUSHDEFS
+AT_BISON_OPTION_PUSHDEFS([%debug])
AT_DATA_GRAMMAR([[input.y]],
[[%debug
AT_DATA_GRAMMAR([[input.y]],
[[%debug
%%
]AT_YYERROR_DEFINE[
]AT_YYLEX_DEFINE(["abd"], [yylval = res])[
%%
]AT_YYERROR_DEFINE[
]AT_YYLEX_DEFINE(["abd"], [yylval = res])[
-int
-main (void)
-{
- yydebug = 1;
- return yyparse ();
-}
]])
AT_BISON_OPTION_POPDEFS
]])
AT_BISON_OPTION_POPDEFS
input.y:21.6-8: warning: useless %printer for type <*> [-Wother]
]])
AT_COMPILE([input])
input.y:21.6-8: warning: useless %printer for type <*> [-Wother]
]])
AT_COMPILE([input])
-AT_PARSER_CHECK([./input], [1], [],
+AT_PARSER_CHECK([./input --debug], [1], [],
[[Starting parse
Entering state 0
Reading a token: Next token is token 'a' ('a')
[[Starting parse
Entering state 0
Reading a token: Next token is token 'a' ('a')
# true for $undefined and the error token, so there are three warnings for
# %printer and three for %destructor.)
# true for $undefined and the error token, so there are three warnings for
# %printer and three for %destructor.)
-AT_BISON_OPTION_PUSHDEFS
+AT_BISON_OPTION_PUSHDEFS([%debug])
AT_DATA_GRAMMAR([[input.y]],
[[%debug /* So that %printer is actually compiled. */
AT_DATA_GRAMMAR([[input.y]],
[[%debug /* So that %printer is actually compiled. */
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]],
[[%debug /* So that %printer is actually compiled. */
AT_DATA_GRAMMAR([[input.y]],
[[%debug /* So that %printer is actually compiled. */
%%
]AT_YYERROR_DEFINE[
]AT_YYLEX_DEFINE[
%%
]AT_YYERROR_DEFINE[
]AT_YYLEX_DEFINE[
-int
-main (void)
-{
- yydebug = 1;
- return yyparse ();
-}
]])
AT_BISON_OPTION_POPDEFS
]])
AT_BISON_OPTION_POPDEFS
-AT_PARSER_CHECK([./input], 1,,
+AT_PARSER_CHECK([./input --debug], 1,,
[[Starting parse
Entering state 0
Reducing stack by rule 1 (line 30):
[[Starting parse
Entering state 0
Reducing stack by rule 1 (line 30):
# -------------------------------------------
m4_define([AT_CHECK_ACTION_LOCATIONS],
[AT_SETUP([[@$ in ]$1[ implies %locations]])
# -------------------------------------------
m4_define([AT_CHECK_ACTION_LOCATIONS],
[AT_SETUP([[@$ in ]$1[ implies %locations]])
-AT_BISON_OPTION_PUSHDEFS
+AT_BISON_OPTION_PUSHDEFS([%debug])
AT_DATA_GRAMMAR([[input.y]],
[[%code {
#include <stdio.h>
AT_DATA_GRAMMAR([[input.y]],
[[%code {
#include <stdio.h>
m4_pushdef([AT_TEST],
[AT_SETUP([[Qualified $$ in actions: $1]])
m4_pushdef([AT_TEST],
[AT_SETUP([[Qualified $$ in actions: $1]])
-AT_BISON_OPTION_PUSHDEFS([%skeleton "$1"])
+AT_BISON_OPTION_PUSHDEFS([%skeleton "$1" %debug])
AT_DATA_GRAMMAR([[input.y]],
[[%skeleton "$1"
AT_DATA_GRAMMAR([[input.y]],
[[%skeleton "$1"
EOF}]],
[[{UNTYPED, INT, EOF}]]),
[AT_VAL.ival = toknum * 10; AT_VAL.fval = toknum / 10.0;])[
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_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
# only the lines from the printer.
AT_CHECK([[sed -ne '/ival:/p' stderr]], 0,
# Don't be too picky on the traces, GLR is not exactly the same. Keep
# only the lines from the printer.
AT_CHECK([[sed -ne '/ival:/p' stderr]], 0,
-AT_BISON_OPTION_PUSHDEFS([%pure-parser])
+AT_BISON_OPTION_PUSHDEFS([%pure-parser %debug])
AT_DATA_GRAMMAR([input.y],
[[
AT_DATA_GRAMMAR([input.y],
[[
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],
[[
%{
%%
]AT_YYLEX_DEFINE(["abc"])[
]AT_YYERROR_DEFINE[
%%
]AT_YYLEX_DEFINE(["abc"])[
]AT_YYERROR_DEFINE[
-int
-main (void)
-{
- yydebug = 1;
- return !!yyparse ();
-}
]])
AT_BISON_OPTION_POPDEFS
]])
AT_BISON_OPTION_POPDEFS
-AT_PARSER_CHECK([[./input]], 1, [],
+AT_PARSER_CHECK([[./input --debug]], 1, [],
[Starting parse
Entering state 0
Reading a token: Next token is token 'a' ()
[Starting parse
Entering state 0
Reading a token: Next token is token 'a' ()
[m4_case(AT_LANG,
[c],
[[#include <stdlib.h> /* getenv. */
[m4_case(AT_LANG,
[c],
[[#include <stdlib.h> /* getenv. */
+#include <string.h> /* strcmp. */
-main (void)
-{]AT_DEBUG_IF([
- yydebug = !!getenv("YYDEBUG");])[
- return !!yyparse ();
+main (int argc, char const* argv[])
+{]AT_DEBUG_IF([[
+ if (getenv("YYDEBUG")
+ || (argc == 2
+ && (!strcmp (argv[1], "-d") || !strcmp (argv[1], "--debug"))))
+ yydebug |= 1;]], [[
+ (void) argc;
+ (void) argv;]])[
+ return yyparse ();
}]],
[c++],
[[#include <cstdlib> // getenv.
}]],
[c++],
[[#include <cstdlib> // getenv.
+#include <cstring> // strcmp.
+main (int argc, char const* argv[])
- yy::parser p;]AT_DEBUG_IF([
- p.set_debug_level (!!getenv("YYDEBUG"));])[
- return !!p.parse ();
+ yy::parser p;]AT_DEBUG_IF([[
+ if (getenv("YYDEBUG")
+ || (argc == 2
+ && (!strcmp (argv[1], "-d") || !strcmp (argv[1], "--debug"))))
+ p.set_debug_level (true);]], [[
+ (void) argc;
+ (void) argv;]])[
+ return p.parse ();
}]],
[java],
[[class input
}]],
[java],
[[class input
%%
]AT_YYERROR_DEFINE[
]AT_YYLEX_DEFINE([":"])[
%%
]AT_YYERROR_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_DATA_DANCER_Y
]AT_MAIN_DEFINE[
]])
])# _AT_DATA_DANCER_Y
# Bison once mistook braced code in a declaration in the rules section to be a
# rule action.
# Bison once mistook braced code in a declaration in the rules section to be a
# rule action.
-AT_BISON_OPTION_PUSHDEFS
+AT_BISON_OPTION_PUSHDEFS([%debug])
AT_DATA_GRAMMAR([input.y],
[[%{
#include <stdio.h>
]AT_YYERROR_DECLARE[
]AT_YYLEX_DECLARE[
%}
AT_DATA_GRAMMAR([input.y],
[[%{
#include <stdio.h>
]AT_YYERROR_DECLARE[
]AT_YYLEX_DECLARE[
%}
%%
]AT_YYERROR_DEFINE[
]AT_YYLEX_DEFINE(["a"])[
%%
]AT_YYERROR_DEFINE[
]AT_YYLEX_DEFINE(["a"])[
-
-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_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.
]],
[[Starting parse
[[Bison would once convert this action to a midrule because of the subsequent braced code.
]],
[[Starting parse
-AT_BISON_CHECK([-t -o input.c input.y])
+AT_BISON_CHECK([-o input.c input.y])
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],
[[%code {
AT_DATA_GRAMMAR([input.y],
[[%code {
]AT_YYERROR_DECLARE[
int yylex (]AT_PURE_IF([[YYSTYPE *]], [[void]])[);
}
]AT_YYERROR_DECLARE[
int yylex (]AT_PURE_IF([[YYSTYPE *]], [[void]])[);
}
]$1[
%define parse.error verbose
%token 'c'
]$1[
%define parse.error verbose
%token 'c'
-int
-main (void)
-{
- yydebug = 1;
- return yyparse ();
-}
]])
AT_BISON_CHECK([[-Dparse.lac=full -Dparse.lac.es-capacity-initial=1 \
-Dparse.lac.memory-trace=full \
]])
AT_BISON_CHECK([[-Dparse.lac=full -Dparse.lac.es-capacity-initial=1 \
-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]
]])
AT_COMPILE([[input]])
[[input.y: warning: 21 shift/reduce conflicts [-Wconflicts-sr]
]])
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
# be forgotten without lookahead correction.
# Make sure syntax error doesn't forget that 'a' is expected. It would
# be forgotten without lookahead correction.
AT_SETUP([[LAC: Memory exhaustion]])
m4_pushdef([AT_LAC_CHECK],
AT_SETUP([[LAC: Memory exhaustion]])
m4_pushdef([AT_LAC_CHECK],
-[AT_BISON_OPTION_PUSHDEFS
+[AT_BISON_OPTION_PUSHDEFS([%debug])
AT_DATA_GRAMMAR([input.y],
[[%code {
#include <stdio.h>
AT_DATA_GRAMMAR([input.y],
[[%code {
#include <stdio.h>
]AT_YYLEX_DECLARE[
#define YYMAXDEPTH 8
}
]AT_YYLEX_DECLARE[
#define YYMAXDEPTH 8
}
%%
]AT_YYERROR_DEFINE[
]AT_YYLEX_DEFINE(["$1"])[
%%
]AT_YYERROR_DEFINE[
]AT_YYLEX_DEFINE(["$1"])[
-int
-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]
]])
AT_COMPILE([[input]])
[[input.y: warning: 8 shift/reduce conflicts [-Wconflicts-sr]
]])
AT_COMPILE([[input]])
# Check for memory exhaustion during parsing.
AT_LAC_CHECK([])
# Check for memory exhaustion during parsing.
AT_LAC_CHECK([])
-AT_PARSER_CHECK([[./input]], [[2]], [],
+AT_PARSER_CHECK([[./input --debug]], [[2]], [],
[[Starting parse
Entering state 0
Reading a token: Now at end of input.
[[Starting parse
Entering state 0
Reading a token: Now at end of input.
# Induce an immediate syntax error with an undefined token, and check
# for memory exhaustion while building syntax error message.
AT_LAC_CHECK([z], [[0]])
# Induce an immediate syntax error with an undefined token, and check
# for memory exhaustion while building syntax error message.
AT_LAC_CHECK([z], [[0]])
-AT_PARSER_CHECK([[./input]], [[2]], [],
+AT_PARSER_CHECK([[./input --debug]], [[2]], [],
[[Starting parse
Entering state 0
Reading a token: Next token is token $undefined ()
[[Starting parse
Entering state 0
Reading a token: Next token is token $undefined ()