bison-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

glr: tests: add support for the YYDEBUG envvar


From: Akim Demaille
Subject: glr: tests: add support for the YYDEBUG envvar
Date: Wed, 16 Dec 2020 07:40:35 +0100

commit b33817f8bb9d21aaaa337c98f3912c2e4a6825fa
Author: Akim Demaille <akim.demaille@gmail.com>
Date:   Wed Dec 16 06:58:58 2020 +0100

    glr: tests: add support for the YYDEBUG envvar
    
    When debugging these parsers, we really need debug traces.
    Enable them, and bind them to $YYDEBUG.
    
    * tests/glr-regression.at: Support the YYDEBUG envvar.
    As a consequence, now that syntactic ambiguities are reported, adjust
    the expected output.
    (No users destructors if stack 0 deleted): Don't return 0 on memory
    exhaustion, really return the parser's status, and adust expectations.

diff --git a/tests/glr-regression.at b/tests/glr-regression.at
index 6d1bc397..01c0b037 100644
--- a/tests/glr-regression.at
+++ b/tests/glr-regression.at
@@ -62,6 +62,7 @@ static YYSTYPE exprMerge (YYSTYPE x0, YYSTYPE x1);
 }
 
 %define parse.assert
+%define parse.trace
 %glr-parser
 %expect 1
 ]$1[
@@ -105,6 +106,8 @@ main (int argc, const char* argv[])
 {
   assert (argc == 2); (void) argc;
   input = argv[1];
+  if (getenv ("YYDEBUG"))
+    yydebug = 1;
   return yyparse ();
 }
 ]])
@@ -159,6 +162,7 @@ AT_DATA_GRAMMAR([glr-regr2a.y],
 }
 
 %define parse.assert
+%define parse.trace
 %glr-parser
 %expect 2
 ]$1[
@@ -237,6 +241,8 @@ main (int argc, char **argv)
   input = stdin;
   if (argc == 2 && !(input = fopen (argv[1], "r")))
     return 3;
+  if (getenv ("YYDEBUG"))
+    yydebug = 1;
   res = yyparse ();
   if (argc == 2 && fclose (input))
     return 4;
@@ -305,6 +311,7 @@ static int MergeRule (int x0, int x1);
 }
 
 %define parse.assert
+%define parse.trace
 %glr-parser
 %expect 1
 %expect-rr 2
@@ -381,6 +388,8 @@ main (int argc, char* argv[])
   input = stdin;
   if (argc == 2 && !(input = fopen (argv[1], "r")))
     return 3;
+  if (getenv ("YYDEBUG"))
+    yydebug = 1;
   res = yyparse ();
   if (argc == 2 && fclose (input))
     return 4;
@@ -422,6 +431,7 @@ AT_BISON_OPTION_PUSHDEFS([%glr-parser $1])
 AT_DATA_GRAMMAR([glr-regr4.y],
 [[
 %define parse.assert
+%define parse.trace
 %union { char *ptr; }
 %type <ptr> S A A1 A2 B
 %glr-parser
@@ -464,7 +474,10 @@ B:  'a' { $$ = make_value ("B", "'a'");  } ;
 int
 main (void)
 {
-  int status = yyparse ();
+  int status = -1;
+  if (getenv ("YYDEBUG"))
+    yydebug = 1;
+  status = yyparse ();
   while (ptrs_next != ptrs)
     free (*--ptrs_next);
   return status;
@@ -526,6 +539,7 @@ AT_DATA_GRAMMAR([glr-regr5.y],
 }
 
 %define parse.assert
+%define parse.trace
 %glr-parser
 %expect 0
 %expect-rr 1
@@ -558,7 +572,16 @@ start:
 AT_FULL_COMPILE([glr-regr5],,,, [-rall])
 
 AT_PARSER_CHECK([[glr-regr5]], 1, [],
-[syntax is ambiguous
+[Ambiguity detected.
+Option 1,
+  start -> <Rule 1, tokens 1 .. 1>
+    'a' <tokens 1 .. 1>
+
+Option 2,
+  start -> <Rule 2, tokens 1 .. 1>
+    'a' <tokens 1 .. 1>
+
+syntax is ambiguous
 ])
 
 AT_BISON_OPTION_POPDEFS
@@ -590,6 +613,7 @@ AT_DATA_GRAMMAR([glr-regr6.y],
 }
 
 %define parse.assert
+%define parse.trace
 %glr-parser
 %expect-rr 1
 ]$1[
@@ -616,7 +640,16 @@ AT_FULL_COMPILE([glr-regr6],,,, [-rall])
 AT_PARSER_CHECK([[glr-regr6]], 1,
 [Destructor called.
 ],
-[syntax is ambiguous
+[Ambiguity detected.
+Option 1,
+  start -> <Rule 1, tokens 1 .. 1>
+    'a' <tokens 1 .. 1>
+
+Option 2,
+  start -> <Rule 2, tokens 1 .. 1>
+    'a' <tokens 1 .. 1>
+
+syntax is ambiguous
 ])
 
 AT_BISON_OPTION_POPDEFS
@@ -658,6 +691,7 @@ AT_DATA_GRAMMAR([glr-regr7.y],
 }
 
 %define parse.assert
+%define parse.trace
 %glr-parser
 %expect-rr 2
 ]$1[
@@ -703,7 +737,10 @@ stack2: 'a' ;
 int
 main (void)
 {
-  int status = yyparse ();
+  int status;
+  if (getenv ("YYDEBUG"))
+    yydebug = 1;
+  status = yyparse ();
   while (tail)
     {
       count_node *prev = tail->prev;
@@ -752,6 +789,7 @@ AT_DATA_GRAMMAR([glr-regr8.y],
 }
 
 %define parse.assert
+%define parse.trace
 %glr-parser
 %expect-rr 1
 ]$1[
@@ -853,6 +891,7 @@ AT_DATA_GRAMMAR([glr-regr9.y],
 }
 
 %define parse.assert
+%define parse.trace
 %glr-parser
 %expect-rr 2
 ]$1[
@@ -891,20 +930,23 @@ ambig2: 'a' ;
 int
 main (void)
 {
-  int exit_status;
-  exit_status = yyparse ();
+  int status;
+  if (getenv ("YYDEBUG"))
+    yydebug = 1;
+  status = yyparse ();
   if (tokens != destructors)
     {
       fprintf (stderr, "Tokens = %d, Destructors = %d\n", tokens, destructors);
-      return 1;
+      return 10;
     }
-  return !exit_status;
+  return status;
 }
 ]])
 
 AT_FULL_COMPILE([glr-regr9],,,, [-rall])
 
-AT_PARSER_CHECK([[glr-regr9]], 0, [],
+# Exit 2: memory exhausted.
+AT_PARSER_CHECK([[glr-regr9]], 2, [],
 [memory exhausted
 ])
 
@@ -938,6 +980,7 @@ AT_DATA_GRAMMAR([glr-regr10.y],
 }
 
 %define parse.assert
+%define parse.trace
 %glr-parser
 %expect-rr 1
 ]$1[
@@ -963,6 +1006,8 @@ main (void)
   int i;
   for (i = 0; i < GARBAGE_SIZE; i+=1)
     garbage[i] = 108;
+  if (getenv ("YYDEBUG"))
+    yydebug = 1;
   return yyparse ();
 }
 ]])
@@ -1001,6 +1046,7 @@ AT_DATA_GRAMMAR([glr-regr11.y],
 }
 
 %define parse.assert
+%define parse.trace
 %glr-parser
 %expect-rr 1
 ]$1[
@@ -1025,13 +1071,16 @@ start:
 int
 main (void)
 {
-  int exit_status = yyparse ();
+  int status;
+  if (getenv ("YYDEBUG"))
+    yydebug = 1;
+  status = yyparse ();
   if (destructors != 1)
     {
       fprintf (stderr, "Destructor calls: %d\n", destructors);
       return 1;
     }
-  return exit_status;
+  return status;
 }
 ]])
 
@@ -1062,6 +1111,7 @@ AT_BISON_OPTION_PUSHDEFS([%glr-parser $1])
 AT_DATA_GRAMMAR([glr-regr12.y],
 [[
 %define parse.assert
+%define parse.trace
 %glr-parser
 %expect 1
 %expect-rr 1
@@ -1146,23 +1196,26 @@ merge (YYSTYPE s1, YYSTYPE s2)
 int
 main (void)
 {
-  int exit_status = yyparse ();
+  int status;
+  if (getenv ("YYDEBUG"))
+    yydebug = 1;
+  status = yyparse ();
   if (parent_rhs_before_value)
     {
       fprintf (stderr, "'parent_rhs_before' destructor not called.\n");
-      exit_status = 1;
+      status = 1;
     }
   if (merged_value)
     {
       fprintf (stderr, "'merged' destructor not called.\n");
-      exit_status = 1;
+      status = 1;
     }
   if (parent_rhs_after_value)
     {
       fprintf (stderr, "'PARENT_RHS_AFTER' destructor not called.\n");
-      exit_status = 1;
+      status = 1;
     }
-  return exit_status;
+  return status;
 }
 ]])
 
@@ -1212,6 +1265,7 @@ AT_DATA_GRAMMAR([glr-regr13.y],
 }
 
 %define parse.assert
+%define parse.trace
 %locations
 %glr-parser
 ]$1[
@@ -1293,6 +1347,8 @@ main (void)
   yychar = '#'; /* Not a token in the grammar.  */
   yylval.value = '!';
 ]])[
+  if (getenv ("YYDEBUG"))
+    yydebug = 1;
   return yyparse ();
 }
 ]])
@@ -1356,6 +1412,7 @@ AT_DATA_GRAMMAR([glr-regr14.y],
        nondeterministic operation does not start.  */
 
 %define parse.assert
+%define parse.trace
 %type <value> 'a' 'b' 'c' 'd' stack_explosion
 %glr-parser
 %expect 0
@@ -1524,6 +1581,8 @@ main (void)
   yychar = '#'; /* Not a token in the grammar.  */
   yylval.value = '!';
 ]])[
+  if (getenv ("YYDEBUG"))
+    yydebug = 1;
   return yyparse ();
 }
 ]])
@@ -1569,6 +1628,7 @@ AT_BISON_OPTION_PUSHDEFS([%glr-parser $1])
 AT_DATA_GRAMMAR([glr-regr15.y],
 [[
 %define parse.assert
+%define parse.trace
 %glr-parser
 %expect 0
 %expect-rr 2
@@ -1623,20 +1683,32 @@ ambiguity2: ;
 int
 main (void)
 {
-  int exit_status = yyparse () != 1;
+  int status;
+  if (getenv ("YYDEBUG"))
+    yydebug = 1;
+  status = yyparse () != 1;
   if (parent_rhs_before_value)
     {
       fprintf (stderr, "'parent_rhs_before' destructor not called.\n");
-      exit_status = 1;
+      status = 1;
     }
-  return exit_status;
+  return status;
 }
 ]])
 
 AT_FULL_COMPILE([glr-regr15],,,, [-rall])
 
 AT_PARSER_CHECK([[glr-regr15]], 0, [],
-[syntax is ambiguous
+[Ambiguity detected.
+Option 1,
+  ambiguity -> <Rule 6, empty>
+    ambiguity1 -> <Rule 8, empty>
+
+Option 2,
+  ambiguity -> <Rule 7, empty>
+    ambiguity2 -> <Rule 9, empty>
+
+syntax is ambiguous
 ])
 
 AT_BISON_OPTION_POPDEFS
@@ -1662,6 +1734,7 @@ AT_BISON_OPTION_PUSHDEFS([%glr-parser $1])
 AT_DATA_GRAMMAR([glr-regr16.y],
 [[
 %define parse.assert
+%define parse.trace
 %glr-parser
 %expect 0
 %expect-rr 1
@@ -1694,13 +1767,16 @@ alt2: ;
 int
 main (void)
 {
-  int exit_status = yyparse () != 1;
+  int status;
+  if (getenv ("YYDEBUG"))
+    yydebug = 1;
+  status = yyparse () != 1;
   if (lookahead_value)
     {
       fprintf (stderr, "Lookahead destructor not called.\n");
-      exit_status = 1;
+      status = 1;
     }
-  return exit_status;
+  return status;
 }
 ]])
 
@@ -1734,6 +1810,7 @@ AT_BISON_OPTION_PUSHDEFS([%glr-parser %locations $1])
 AT_DATA_GRAMMAR([glr-regr17.y],
 [[
 %define parse.assert
+%define parse.trace
 %glr-parser
 %expect 0
 %expect-rr 3
@@ -1791,7 +1868,26 @@ empty2: ;
 AT_FULL_COMPILE([glr-regr17],,,, [-rall])
 
 AT_PARSER_CHECK([[glr-regr17]], 1, [],
-[1.1-2.2: syntax is ambiguous
+[Ambiguity detected.
+Option 1,
+  start -> <Rule 1, tokens 1 .. 2>
+    ambig1 -> <Rule 4, tokens 1 .. 2>
+      sub_ambig2 -> <Rule 8, tokens 1 .. 2>
+        empty2 -> <Rule 10, empty>
+        'a' <tokens 1 .. 1>
+        'b' <tokens 2 .. 2>
+    empty1 -> <Rule 9, empty>
+
+Option 2,
+  start -> <Rule 2, tokens 1 .. 2>
+    ambig2 -> <Rule 6, tokens 1 .. 2>
+      sub_ambig2 -> <Rule 8, tokens 1 .. 2>
+        empty2 -> <Rule 10, empty>
+        'a' <tokens 1 .. 1>
+        'b' <tokens 2 .. 2>
+    empty2 -> <Rule 10, empty>
+
+1.1-2.2: syntax is ambiguous
 ])
 
 AT_BISON_OPTION_POPDEFS
@@ -1816,6 +1912,7 @@ m4_pushdef([AT_TEST],
 AT_BISON_OPTION_PUSHDEFS([%glr-parser $1])
 AT_DATA_GRAMMAR([glr-regr18.y],
 [[%define parse.assert
+%define parse.trace
 %glr-parser
 ]$1[
 
@@ -1849,10 +1946,10 @@ sym3: %merge<merge> { $$ = 0; } ;
 ]])
 
 AT_BISON_CHECK([[-o glr-regr18.c -rall glr-regr18.y]], 1, [],
-[[glr-regr18.y:29.18-24: error: result type clash on merge function 'merge': 
<type2> != <type1>
-glr-regr18.y:28.18-24: note: previous declaration
-glr-regr18.y:30.13-19: error: result type clash on merge function 'merge': 
<type3> != <type2>
+[[glr-regr18.y:30.18-24: error: result type clash on merge function 'merge': 
<type2> != <type1>
 glr-regr18.y:29.18-24: note: previous declaration
+glr-regr18.y:31.13-19: error: result type clash on merge function 'merge': 
<type3> != <type2>
+glr-regr18.y:30.18-24: note: previous declaration
 ]])
 
 AT_BISON_OPTION_POPDEFS
@@ -1882,6 +1979,7 @@ AT_DATA_GRAMMAR([input.y],
 }
 
 %define parse.assert
+%define parse.trace
 %debug
 %glr-parser
 %expect 0
@@ -1917,7 +2015,7 @@ Reading a token
 Next token is token 'b' ()
 Shifting token 'b' ()
 Entering state 3
-Reducing stack 0 by rule 3 (line 29):
+Reducing stack 0 by rule 3 (line 30):
    $][1 = token 'b' ()
 -> $][$ = nterm b ()
 Entering state 4
@@ -1925,7 +2023,7 @@ Reading a token
 Next token is token 'c' ()
 Shifting token 'c' ()
 Entering state 6
-Reducing stack 0 by rule 4 (line 30):
+Reducing stack 0 by rule 4 (line 31):
 -> $][$ = nterm d ()
 Entering state 7
 Reading a token
@@ -1933,10 +2031,10 @@ Now at end of input.
 Stack 0 Entering state 7
 Now at end of input.
 Splitting off stack 1 from 0.
-Reduced stack 1 by rule 2 (line 27); action deferred.  Now in state 2.
+Reduced stack 1 by rule 2 (line 28); action deferred.  Now in state 2.
 Stack 1 Entering state 2
 Now at end of input.
-Reduced stack 0 by rule 1 (line 26); action deferred.  Now in state 2.
+Reduced stack 0 by rule 1 (line 27); action deferred.  Now in state 2.
 Merging stack 0 into stack 1.
 Stack 1 Entering state 2
 Now at end of input.
@@ -1993,6 +2091,7 @@ m4_pushdef([AT_TEST],
 AT_BISON_OPTION_PUSHDEFS([%glr-parser $1])
 AT_DATA_GRAMMAR([input.y],
 [[%define parse.assert
+%define parse.trace
 %glr-parser
 %define parse.error verbose
 %expect-rr 1
@@ -2033,6 +2132,8 @@ main (int argc, const char* argv[])
   // Then the input.
   new_syntax = argv[1][0] == 'N';
   input = argv[1] + 1;
+  if (getenv ("YYDEBUG"))
+    yydebug = 1;
   return yyparse ();
 }
 ]])




reply via email to

[Prev in Thread] Current Thread [Next in Thread]