traces: show the stack after reading a token

Currently, if we have long rules and series of shift, we stack states
without showing stack.  Let's be more incremental, and do how the Java
skeleton does.

* data/skeletons/lalr1.cc, data/skeletons/lalr1.d,
* data/skeletons/yacc.c:
Here.
Adjust test cases.
* tests/torture.at (AT_DATA_STACK_TORTURE): Disable stack traces: this
test produces a very large stack, and showing the stack each time we
shift a token goes quadatric.
This commit is contained in:
Akim Demaille
2020-02-04 07:44:00 +01:00
parent bba2f0a3a0
commit 37aeda6fb3
9 changed files with 45 additions and 4 deletions

View File

@@ -854,6 +854,7 @@ b4_dollar_popdef])[]dnl
`-----------------------------------------------*/
yynewstate:
YYCDEBUG << "Entering state " << int (yystack_[0].state) << '\n';
YY_STACK_PRINT ();
// Accept?
if (yystack_[0].state == yyfinal_)

View File

@@ -476,7 +476,9 @@ m4_popdef([b4_at_dollar])])dnl
/* New state. Unlike in the C/C++ skeletons, the state is already
pushed when we come here. */
case YYNEWSTATE:]b4_parse_trace_if([[
yycdebugln (format("Entering state %d", yystate));]])[
yycdebugln (format("Entering state %d", yystate));
if (0 < yydebug)
yystack.print (yyDebugStream);]])[
/* Accept? */
if (yystate == yyfinal_)

View File

@@ -1596,6 +1596,7 @@ yysetstate:
YY_IGNORE_USELESS_CAST_BEGIN
*yyssp = YY_CAST (yy_state_t, yystate);
YY_IGNORE_USELESS_CAST_END
YY_STACK_PRINT (yyss, yyssp);
if (yyss + yystacksize - 1 <= yyssp)
#if !defined yyoverflow && !defined YYSTACK_RELOCATE

View File

@@ -34,6 +34,7 @@ input:
line:
'\n'
| 'a' 'a' 'a' 'a' 'a' 'a' 'a' 'a' 'a' 'a' 'a' 'a' 'a' 'a' 'a' 'a' { printf ("a\n"); }
| expr '\n' { printf ("%.10g\n", $1); }
| error '\n' { yyerrok; }
;

View File

@@ -1123,22 +1123,27 @@ AT_PARSER_CHECK([input --debug], 1,
]],
[[Starting parse
Entering state 0
Stack now 0
Reading a token
Next token is token 'a' (1.1: <> printer for 'a' @ 1)
Shifting token 'a' (1.1: <> printer for 'a' @ 1)
Entering state 1
Stack now 0 1
Reading a token
Next token is token 'b' (1.2: 'b'/'c' printer for 'b' @ 2)
Shifting token 'b' (1.2: 'b'/'c' printer for 'b' @ 2)
Entering state 3
Stack now 0 1 3
Reading a token
Next token is token 'c' (1.3: 'b'/'c' printer for 'c' @ 3)
Shifting token 'c' (1.3: 'b'/'c' printer for 'c' @ 3)
Entering state 5
Stack now 0 1 3 5
Reading a token
Next token is token 'd' (1.4: <> printer for 'd' @ 4)
Shifting token 'd' (1.4: <> printer for 'd' @ 4)
Entering state 6
Stack now 0 1 3 5 6
Reading a token
Now at end of input.
1.5: syntax error, unexpected $end, expecting 'e'
@@ -1237,30 +1242,37 @@ AT_PARSER_CHECK([input --debug], 1,
]],
[[Starting parse
Entering state 0
Stack now 0
Reading a token
Next token is token 'a' (<*>/<field2>/e printer)
Shifting token 'a' (<*>/<field2>/e printer)
Entering state 1
Stack now 0 1
Reading a token
Next token is token 'b' (<field1> printer)
Shifting token 'b' (<field1> printer)
Entering state 3
Stack now 0 1 3
Reading a token
Next token is token 'c' ('c' printer)
Shifting token 'c' ('c' printer)
Entering state 5
Stack now 0 1 3 5
Reading a token
Next token is token 'd' ('d' printer)
Shifting token 'd' ('d' printer)
Entering state 6
Stack now 0 1 3 5 6
Reading a token
Next token is token 'e' (<*>/<field2>/e printer)
Shifting token 'e' (<*>/<field2>/e printer)
Entering state 7
Stack now 0 1 3 5 6 7
Reading a token
Next token is token 'f' (<*>/<field2>/e printer)
Shifting token 'f' (<*>/<field2>/e printer)
Entering state 8
Stack now 0 1 3 5 6 7 8
Reading a token
Now at end of input.
syntax error, unexpected $end, expecting 'g'
@@ -1370,15 +1382,18 @@ AT_PARSER_CHECK([input$1 --debug], 0,
]],
[[Starting parse
Entering state 0
Stack now 0
Reducing stack by rule 1 (line 49):
-> $$ = nterm start (1.1: <]]kind[[> for 'S' @ 1)
Stack now 0
Entering state 1
Stack now 0 1
Reading a token
Now at end of input.
Shifting token END (1.1: <]]kind[[> for 'E' @ 1)
Entering state 2
Stack now 0 1 2
Stack now 0 1 2
Cleanup: popping token END (1.1: <]]kind[[> for 'E' @ 1)
Cleanup: popping nterm start (1.1: <]]kind[[> for 'S' @ 1)
]])
@@ -1453,18 +1468,22 @@ AT_COMPILE([input])
AT_PARSER_CHECK([input --debug], [1], [],
[[Starting parse
Entering state 0
Stack now 0
Reading a token
Next token is token 'a' ('a')
Shifting token 'a' ('a')
Entering state 1
Stack now 0 1
Reading a token
Next token is token 'b' ('b')
syntax error
Shifting token error ()
Entering state 3
Stack now 0 1 3
Next token is token 'b' ('b')
Shifting token 'b' ('b')
Entering state 5
Stack now 0 1 3 5
Reading a token
Next token is token $undefined ()
Error: popping token 'b' ('b')
@@ -1474,12 +1493,14 @@ Error: popping token error ()
Stack now 0 1
Shifting token error ()
Entering state 3
Stack now 0 1 3
Next token is token $undefined ()
Error: discarding token $undefined ()
Error: popping token error ()
Stack now 0 1
Shifting token error ()
Entering state 3
Stack now 0 1 3
Reading a token
Now at end of input.
Cleanup: discarding lookahead token $end ()
@@ -1625,22 +1646,27 @@ AT_COMPILE([input])
AT_PARSER_CHECK([input --debug], 1,,
[[Starting parse
Entering state 0
Stack now 0
Reducing stack by rule 1 (line 30):
-> $$ = nterm $@1 (: )
Stack now 0
Entering state 2
Stack now 0 2
Reducing stack by rule 2 (line 31):
-> $$ = nterm @2 (: 2)
Stack now 0 2
Entering state 4
Stack now 0 2 4
Reducing stack by rule 3 (line 32):
-> $$ = nterm @3 (: 3)
Stack now 0 2 4
Entering state 5
Stack now 0 2 4 5
Reducing stack by rule 4 (line 33):
-> $$ = nterm @4 (: 4)
Stack now 0 2 4 5
Entering state 6
Stack now 0 2 4 5 6
Reading a token
Now at end of input.
syntax error

View File

@@ -648,25 +648,30 @@ AT_FULL_COMPILE([[input]])
AT_PARSER_CHECK([[input]], [[0]], [[]],
[[Starting parse
Entering state 0
Stack now 0
Reading a token
Next token is token NUMBER (1)
Shifting token NUMBER (1)
Entering state 1
Stack now 0 1
Reducing stack by rule 1 (line 34):
$1 = token NUMBER (1)
-> $$ = nterm expr (10)
destroy: 1
Stack now 0
Entering state 2
Stack now 0 2
Reading a token
Next token is token NUMBER (30)
Reducing stack by rule 2 (line 35):
-> $$ = nterm @1 (20)
Stack now 0 2
Entering state 4
Stack now 0 2 4
Next token is token NUMBER (30)
Shifting token NUMBER (30)
Entering state 5
Stack now 0 2 4 5
Reducing stack by rule 3 (line 35):
$1 = nterm expr (10)
$2 = nterm @1 (20)
@@ -678,11 +683,13 @@ destroy: 20
destroy: 10
Stack now 0
Entering state 2
Stack now 0 2
Reading a token
Next token is token EOI ()
Shifting token EOI ()
Entering state 3
Stack now 0 2 3
Stack now 0 2 3
Cleanup: popping token EOI ()
Cleanup: popping nterm expr (40)
destroy: 40

View File

@@ -922,7 +922,7 @@ _AT_CHECK_CALC([$1],
2^2^3 = 256
(2^2)^3 = 64],
[[final: 64 12 0]],
[931])
[1111])
# Some syntax errors.
_AT_CHECK_CALC_ERROR([$1], [1], [1 2],

View File

@@ -960,10 +960,12 @@ AT_PARSER_CHECK([input --debug], 1,
]],
[[Starting parse
Entering state 0
Stack now 0
Reducing stack by rule 1 (line 20):
-> $$ = nterm start ()
Stack now 0
Entering state 1
Stack now 0 1
Reading a token
Next token is token 'a' (PRINTER)
syntax error, unexpected 'a', expecting $end
@@ -1441,6 +1443,7 @@ AT_LAC_CHECK([])
AT_PARSER_CHECK([[input --debug]], [[2]], [],
[[Starting parse
Entering state 0
Stack now 0
Reading a token
Now at end of input.
LAC: initial context established for $end
@@ -1456,6 +1459,7 @@ AT_LAC_CHECK([z], [[0]])
AT_PARSER_CHECK([[input --debug]], [[2]], [],
[[Starting parse
Entering state 0
Stack now 0
Reading a token
Next token is token $undefined ()
LAC: initial context established for $undefined

View File

@@ -417,7 +417,6 @@ AT_DATA_GRAMMAR([input.y],
%}
]$2[
%define parse.error verbose
%debug
%token WAIT_FOR_EOF
%%
exp: WAIT_FOR_EOF exp | ;
@@ -457,7 +456,7 @@ main (int argc, const char **argv)
int count;
]m4_bmatch([$2], [api.push-pull both],
[[ yypstate *ps = yypstate_new ();
]])[ yydebug = 1;
]])[
for (count = 0; count < 2; ++count)
{
int new_status;