mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-09 12:23:04 +00:00
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:
@@ -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],
|
||||||
[[
|
[[
|
||||||
|
|||||||
@@ -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' ()
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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 ()
|
||||||
|
|||||||
Reference in New Issue
Block a user