]> git.saurik.com Git - bison.git/blobdiff - tests/glr-regression.at
Merge tag 'v2.5.1_rc2'
[bison.git] / tests / glr-regression.at
index 83fd382b9f16a7a5d3996fcd66d7c3fb67f66a4a..4ac48611104f1924f838a6c24f5c9ebaefe1144a 100644 (file)
@@ -1,6 +1,6 @@
 # Checking GLR Parsing: Regression Tests           -*- Autotest -*-
 
 # Checking GLR Parsing: Regression Tests           -*- Autotest -*-
 
-# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2009, 2010 Free Software
+# Copyright (C) 2002-2003, 2005-2007, 2009-2012 Free Software
 # Foundation, Inc.
 
 # This program is free software: you can redistribute it and/or modify
 # Foundation, Inc.
 
 # This program is free software: you can redistribute it and/or modify
@@ -85,12 +85,12 @@ yylex (void)
     {
       int ch;
       if (feof (stdin))
     {
       int ch;
       if (feof (stdin))
-       abort ();
+        abort ();
       ch = getchar ();
       if (ch == EOF)
       ch = getchar ();
       if (ch == EOF)
-       return 0;
+        return 0;
       else if (ch == 'B' || ch == 'P')
       else if (ch == 'B' || ch == 'P')
-       return ch;
+        return ch;
     }
 }
 ]])
     }
 }
 ]])
@@ -298,7 +298,7 @@ static void yyerror(char const * s) {
   fprintf(stderr,"error: %s\n",s);
 }
 
   fprintf(stderr,"error: %s\n",s);
 }
 
-FILE *input = NULL;
+FILE *input = YY_NULL;
 
 int P[] = { P1, P2 };
 int O[] = { O1, O2 };
 
 int P[] = { P1, P2 };
 int O[] = { O1, O2 };
@@ -341,7 +341,7 @@ AT_CLEANUP
 
 
 ## ------------------------------------------------------------------------- ##
 
 
 ## ------------------------------------------------------------------------- ##
-## Duplicate representation of merged trees.  See                           ##
+## Duplicate representation of merged trees.  See                            ##
 ## <http://lists.gnu.org/archive/html/help-bison/2005-07/msg00013.html>.     ##
 ## ------------------------------------------------------------------------- ##
 
 ## <http://lists.gnu.org/archive/html/help-bison/2005-07/msg00013.html>.     ##
 ## ------------------------------------------------------------------------- ##
 
@@ -444,7 +444,7 @@ AT_CLEANUP
 
 
 ## -------------------------------------------------------------------------- ##
 
 
 ## -------------------------------------------------------------------------- ##
-## User destructor for unresolved GLR semantic value.  See                   ##
+## User destructor for unresolved GLR semantic value.  See                    ##
 ## <http://lists.gnu.org/archive/html/bison-patches/2005-08/msg00016.html>.   ##
 ## -------------------------------------------------------------------------- ##
 
 ## <http://lists.gnu.org/archive/html/bison-patches/2005-08/msg00016.html>.   ##
 ## -------------------------------------------------------------------------- ##
 
@@ -517,7 +517,7 @@ AT_CLEANUP
 
 
 ## -------------------------------------------------------------------------- ##
 
 
 ## -------------------------------------------------------------------------- ##
-## User destructor after an error during a split parse.  See                 ##
+## User destructor after an error during a split parse.  See                  ##
 ## <http://lists.gnu.org/archive/html/bison-patches/2005-08/msg00029.html>.   ##
 ## -------------------------------------------------------------------------- ##
 
 ## <http://lists.gnu.org/archive/html/bison-patches/2005-08/msg00029.html>.   ##
 ## -------------------------------------------------------------------------- ##
 
@@ -584,7 +584,7 @@ AT_CLEANUP
 
 
 ## ------------------------------------------------------------------------- ##
 
 
 ## ------------------------------------------------------------------------- ##
-## Duplicated user destructor for lookahead.  See                           ##
+## Duplicated user destructor for lookahead.  See                            ##
 ## <http://lists.gnu.org/archive/html/bison-patches/2005-08/msg00035.html>.  ##
 ## ------------------------------------------------------------------------- ##
 
 ## <http://lists.gnu.org/archive/html/bison-patches/2005-08/msg00035.html>.  ##
 ## ------------------------------------------------------------------------- ##
 
@@ -675,7 +675,7 @@ AT_CLEANUP
 
 ## ------------------------------------------------------------------------- ##
 ## Incorrect default location for empty right-hand sides.  Adapted from bug  ##
 
 ## ------------------------------------------------------------------------- ##
 ## Incorrect default location for empty right-hand sides.  Adapted from bug  ##
-## report by Claudia Hermann.                                               ##
+## report by Claudia Hermann.                                                ##
 ## See http://lists.gnu.org/archive/html/bug-bison/2005-10/msg00069.html and ##
 ## http://lists.gnu.org/archive/html/bug-bison/2005-10/msg00072.html         ##
 ## ------------------------------------------------------------------------- ##
 ## See http://lists.gnu.org/archive/html/bug-bison/2005-10/msg00069.html and ##
 ## http://lists.gnu.org/archive/html/bug-bison/2005-10/msg00072.html         ##
 ## ------------------------------------------------------------------------- ##
@@ -701,25 +701,25 @@ AT_DATA_GRAMMAR([glr-regr8.y],
 %%
 
 
 %%
 
 
-PortClause     : T_PORT InterfaceDeclaration T_PORT
-               { printf("%d/%d - %d/%d - %d/%d\n",
-                        @1.first_column, @1.last_column,
-                        @2.first_column, @2.last_column,
-                        @3.first_column, @3.last_column); }
-       ;
+PortClause      : T_PORT InterfaceDeclaration T_PORT
+                { printf("%d/%d - %d/%d - %d/%d\n",
+                         @1.first_column, @1.last_column,
+                         @2.first_column, @2.last_column,
+                         @3.first_column, @3.last_column); }
+        ;
 
 
-InterfaceDeclaration   : OptConstantWord       %dprec 1
-       | OptSignalWord %dprec 2
-       ;
+InterfaceDeclaration    : OptConstantWord       %dprec 1
+        | OptSignalWord %dprec 2
+        ;
 
 
-OptConstantWord        : /* empty */
-       | T_CONSTANT
-       ;
+OptConstantWord : /* empty */
+        | T_CONSTANT
+        ;
 
 
-OptSignalWord  : /* empty */
-               { printf("empty: %d/%d\n", @$.first_column, @$.last_column); }
-       | T_SIGNAL
-       ;
+OptSignalWord   : /* empty */
+                { printf("empty: %d/%d\n", @$.first_column, @$.last_column); }
+        | T_SIGNAL
+        ;
 
 %%
 
 
 %%
 
@@ -774,7 +774,7 @@ AT_CLEANUP
 
 
 ## ------------------------------------------------------------------------- ##
 
 
 ## ------------------------------------------------------------------------- ##
-## No users destructors if stack 0 deleted.  See                            ##
+## No users destructors if stack 0 deleted.  See                             ##
 ## <http://lists.gnu.org/archive/html/bison-patches/2005-09/msg00109.html>.  ##
 ## ------------------------------------------------------------------------- ##
 
 ## <http://lists.gnu.org/archive/html/bison-patches/2005-09/msg00109.html>.  ##
 ## ------------------------------------------------------------------------- ##
 
@@ -855,7 +855,7 @@ AT_CLEANUP
 
 
 ## ------------------------------------------------------------------------- ##
 
 
 ## ------------------------------------------------------------------------- ##
-## Corrupted semantic options if user action cuts parse.                    ##
+## Corrupted semantic options if user action cuts parse.                     ##
 ## ------------------------------------------------------------------------- ##
 
 AT_SETUP([Corrupted semantic options if user action cuts parse])
 ## ------------------------------------------------------------------------- ##
 
 AT_SETUP([Corrupted semantic options if user action cuts parse])
@@ -920,7 +920,7 @@ AT_CLEANUP
 
 
 ## ------------------------------------------------------------------------- ##
 
 
 ## ------------------------------------------------------------------------- ##
-## Undesirable destructors if user action cuts parse.                       ##
+## Undesirable destructors if user action cuts parse.                        ##
 ## ------------------------------------------------------------------------- ##
 
 AT_SETUP([Undesirable destructors if user action cuts parse])
 ## ------------------------------------------------------------------------- ##
 
 AT_SETUP([Undesirable destructors if user action cuts parse])
@@ -989,7 +989,7 @@ AT_CLEANUP
 
 
 ## ------------------------------------------------------------------------- ##
 
 
 ## ------------------------------------------------------------------------- ##
-## Leaked semantic values if user action cuts parse.                        ##
+## Leaked semantic values if user action cuts parse.                         ##
 ## ------------------------------------------------------------------------- ##
 
 AT_SETUP([Leaked semantic values if user action cuts parse])
 ## ------------------------------------------------------------------------- ##
 
 AT_SETUP([Leaked semantic values if user action cuts parse])
@@ -1120,7 +1120,7 @@ AT_CLEANUP
 
 
 ## ------------------------------------------------------------------------- ##
 
 
 ## ------------------------------------------------------------------------- ##
-## Incorrect lookahead during deterministic GLR.  See                       ##
+## Incorrect lookahead during deterministic GLR.  See                        ##
 ## <http://lists.gnu.org/archive/html/help-bison/2005-07/msg00017.html> and  ##
 ## <http://lists.gnu.org/archive/html/bison-patches/2006-01/msg00060.html>.  ##
 ## ------------------------------------------------------------------------- ##
 ## <http://lists.gnu.org/archive/html/help-bison/2005-07/msg00017.html> and  ##
 ## <http://lists.gnu.org/archive/html/bison-patches/2006-01/msg00060.html>.  ##
 ## ------------------------------------------------------------------------- ##
@@ -1221,10 +1221,10 @@ print_lookahead (char const *reduction)
     {
       printf ("'%c', yylval='", yychar);
       if (yylval.value > ' ')
     {
       printf ("'%c', yylval='", yychar);
       if (yylval.value > ' ')
-       printf ("%c", yylval.value);
+        printf ("%c", yylval.value);
       printf ("', yylloc=(%d,%d),(%d,%d)",
       printf ("', yylloc=(%d,%d),(%d,%d)",
-             yylloc.first_line, yylloc.first_column,
-             yylloc.last_line, yylloc.last_column);
+              yylloc.first_line, yylloc.first_column,
+              yylloc.last_line, yylloc.last_column);
     }
   printf ("\n");
 }
     }
   printf ("\n");
 }
@@ -1258,7 +1258,7 @@ AT_CLEANUP
 
 
 ## ------------------------------------------------------------------------- ##
 
 
 ## ------------------------------------------------------------------------- ##
-## Incorrect lookahead during nondeterministic GLR.                         ##
+## Incorrect lookahead during nondeterministic GLR.                          ##
 ## ------------------------------------------------------------------------- ##
 
 AT_SETUP([Incorrect lookahead during nondeterministic GLR])
 ## ------------------------------------------------------------------------- ##
 
 AT_SETUP([Incorrect lookahead during nondeterministic GLR])
@@ -1318,7 +1318,7 @@ merge:
   | conflict defstate_look 'a' nonconflict2 'b' defstate_shift %dprec 2 {
     USE ($3); USE ($5);
     print_lookahead ("merge <- conflict defstate_look 'a' nonconflict2 'b'"
   | conflict defstate_look 'a' nonconflict2 'b' defstate_shift %dprec 2 {
     USE ($3); USE ($5);
     print_lookahead ("merge <- conflict defstate_look 'a' nonconflict2 'b'"
-                     " defstate_shift");
+                      " defstate_shift");
   }
   ;
 
   }
   ;
 
@@ -1365,7 +1365,7 @@ alt1:
     USE ($1);
     if (yychar != 'd' && yychar != YYEOF)
       {
     USE ($1);
     if (yychar != 'd' && yychar != YYEOF)
       {
-       fprintf (stderr, "Incorrect lookahead during stack explosion.\n");
+        fprintf (stderr, "Incorrect lookahead during stack explosion.\n");
       }
   }
   ;
       }
   }
   ;
@@ -1374,7 +1374,7 @@ alt2:
     USE ($1);
     if (yychar != 'd' && yychar != YYEOF)
       {
     USE ($1);
     if (yychar != 'd' && yychar != YYEOF)
       {
-       fprintf (stderr, "Incorrect lookahead during stack explosion.\n");
+        fprintf (stderr, "Incorrect lookahead during stack explosion.\n");
       }
   }
   ;
       }
   }
   ;
@@ -1383,7 +1383,7 @@ alt3:
     USE ($1);
     if (yychar != 'd' && yychar != YYEOF)
       {
     USE ($1);
     if (yychar != 'd' && yychar != YYEOF)
       {
-       fprintf (stderr, "Incorrect lookahead during stack explosion.\n");
+        fprintf (stderr, "Incorrect lookahead during stack explosion.\n");
       }
   }
   ;
       }
   }
   ;
@@ -1391,8 +1391,8 @@ no_look:
   {
     if (yychar != YYEMPTY)
       {
   {
     if (yychar != YYEMPTY)
       {
-       fprintf (stderr,
-                "Found lookahead where shouldn't during stack explosion.\n");
+        fprintf (stderr,
+                 "Found lookahead where shouldn't during stack explosion.\n");
       }
   }
   ;
       }
   }
   ;
@@ -1430,10 +1430,10 @@ print_lookahead (char const *reduction)
     {
       printf ("'%c', yylval='", yychar);
       if (yylval.value > ' ')
     {
       printf ("'%c', yylval='", yychar);
       if (yylval.value > ' ')
-       printf ("%c", yylval.value);
+        printf ("%c", yylval.value);
       printf ("', yylloc=(%d,%d),(%d,%d)",
       printf ("', yylloc=(%d,%d),(%d,%d)",
-             yylloc.first_line, yylloc.first_column,
-             yylloc.last_line, yylloc.last_column);
+              yylloc.first_line, yylloc.first_column,
+              yylloc.last_line, yylloc.last_column);
     }
   printf ("\n");
 }
     }
   printf ("\n");
 }
@@ -1478,7 +1478,7 @@ AT_CLEANUP
 
 
 ## ------------------------------------------------------------------------- ##
 
 
 ## ------------------------------------------------------------------------- ##
-## Leaked semantic values when reporting ambiguity.                         ##
+## Leaked semantic values when reporting ambiguity.                          ##
 ## ------------------------------------------------------------------------- ##
 
 AT_SETUP([Leaked semantic values when reporting ambiguity])
 ## ------------------------------------------------------------------------- ##
 
 AT_SETUP([Leaked semantic values when reporting ambiguity])
@@ -1571,7 +1571,7 @@ AT_CLEANUP
 
 
 ## ------------------------------------------------------------------------- ##
 
 
 ## ------------------------------------------------------------------------- ##
-## Leaked lookahead after nondeterministic parse syntax error.              ##
+## Leaked lookahead after nondeterministic parse syntax error.               ##
 ## ------------------------------------------------------------------------- ##
 
 AT_SETUP([Leaked lookahead after nondeterministic parse syntax error])
 ## ------------------------------------------------------------------------- ##
 
 AT_SETUP([Leaked lookahead after nondeterministic parse syntax error])
@@ -1640,7 +1640,7 @@ AT_CLEANUP
 
 
 ## ------------------------------------------------------------------------- ##
 
 
 ## ------------------------------------------------------------------------- ##
-## Uninitialized location when reporting ambiguity.                         ##
+## Uninitialized location when reporting ambiguity.                          ##
 ## ------------------------------------------------------------------------- ##
 
 AT_SETUP([Uninitialized location when reporting ambiguity])
 ## ------------------------------------------------------------------------- ##
 
 AT_SETUP([Uninitialized location when reporting ambiguity])
@@ -1689,8 +1689,8 @@ empty2: ;
 static void
 yyerror (YYLTYPE *locp, char const *msg)
 {
 static void
 yyerror (YYLTYPE *locp, char const *msg)
 {
-  fprintf (stderr, "Error at %d.%d-%d.%d: %s.\n", locp->first_line,
-          locp->first_column, locp->last_line, locp->last_column, msg);
+  fprintf (stderr, "%d.%d-%d.%d: %s.\n", locp->first_line,
+           locp->first_column, locp->last_line, locp->last_column, msg);
 }
 
 static int
 }
 
 static int
@@ -1720,7 +1720,7 @@ AT_BISON_CHECK([[-o glr-regr17.c glr-regr17.y]], 0, [],
 AT_COMPILE([glr-regr17])
 
 AT_PARSER_CHECK([[./glr-regr17]], 0, [],
 AT_COMPILE([glr-regr17])
 
 AT_PARSER_CHECK([[./glr-regr17]], 0, [],
-[Error at 1.1-2.3: syntax is ambiguous.
+[1.1-2.3: syntax is ambiguous.
 ])
 
 AT_CLEANUP
 ])
 
 AT_CLEANUP
@@ -1781,10 +1781,127 @@ main (void)
 ]])
 
 AT_BISON_CHECK([[-o glr-regr18.c glr-regr18.y]], 1, [],
 ]])
 
 AT_BISON_CHECK([[-o glr-regr18.c glr-regr18.y]], 1, [],
-[glr-regr18.y:26.18-24: result type clash on merge function `merge': <type2> != <type1>
+[glr-regr18.y:26.18-24: result type clash on merge function 'merge': <type2> != <type1>
 glr-regr18.y:25.18-24: previous declaration
 glr-regr18.y:25.18-24: previous declaration
-glr-regr18.y:27.13-19: result type clash on merge function `merge': <type3> != <type2>
+glr-regr18.y:27.13-19: result type clash on merge function 'merge': <type3> != <type2>
 glr-regr18.y:26.18-24: previous declaration
 ])
 
 AT_CLEANUP
 glr-regr18.y:26.18-24: previous declaration
 ])
 
 AT_CLEANUP
+
+
+## ------------------- ##
+## Ambiguity reports.  ##
+## ------------------- ##
+
+AT_SETUP([Ambiguity reports])
+
+AT_DATA_GRAMMAR([input.y],
+[[
+%{
+  #include <stdio.h>
+  #include <stdlib.h>
+  static void yyerror (char const *);
+  static int yylex (void);
+%}
+
+%debug
+%glr-parser
+
+%%
+start:
+  'a' b 'c' d
+| 'a' b 'c' d
+;
+b: 'b';
+d: /* nada.  */;
+%%
+
+static int
+yylex (void)
+{
+  static char const input[] = "abc";
+  static size_t toknum;
+  if (! (toknum < sizeof input))
+    abort ();
+  return input[toknum++];
+}
+
+static void
+yyerror (char const *msg)
+{
+  fprintf (stderr, "%s\n", msg);
+}
+
+int
+main (void)
+{
+  yydebug = 1;
+  return !!yyparse ();
+}
+]])
+
+AT_BISON_CHECK([[-o input.c input.y]], 0, [],
+[input.y: conflicts: 1 reduce/reduce
+])
+AT_COMPILE([input])
+
+AT_PARSER_CHECK([[./input]], 1, [],
+[Starting parse
+Entering state 0
+Reading a token: Next token is token 'a' ()
+Shifting token 'a' ()
+Entering state 1
+Reading a token: Next token is token 'b' ()
+Shifting token 'b' ()
+Entering state 3
+Reducing stack 0 by rule 3 (line 25):
+   $1 = token 'b' ()
+-> $$ = nterm b ()
+Entering state 4
+Reading a token: Next token is token 'c' ()
+Shifting token 'c' ()
+Entering state 6
+Reducing stack 0 by rule 4 (line 26):
+-> $$ = nterm d ()
+Entering state 7
+Reading a token: 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; action deferred.  Now in state 2.
+Stack 1 Entering state 2
+Now at end of input.
+Reduced stack 0 by rule #1; action deferred.  Now in state 2.
+Merging stack 0 into stack 1.
+Stack 1 Entering state 2
+Now at end of input.
+Removing dead stacks.
+Rename stack 1 -> 0.
+On stack 0, shifting token $end ()
+Stack 0 now in state #5
+Ambiguity detected.
+Option 1,
+  start -> <Rule 1, tokens 1 .. 3>
+    'a' <tokens 1 .. 1>
+    b <tokens 2 .. 2>
+    'c' <tokens 3 .. 3>
+    d <empty>
+
+Option 2,
+  start -> <Rule 2, tokens 1 .. 3>
+    'a' <tokens 1 .. 1>
+    b <tokens 2 .. 2>
+    'c' <tokens 3 .. 3>
+    d <empty>
+
+syntax is ambiguous
+Cleanup: popping token $end ()
+Cleanup: popping unresolved nterm start ()
+Cleanup: popping nterm d ()
+Cleanup: popping token 'c' ()
+Cleanup: popping nterm b ()
+Cleanup: popping token 'a' ()
+])
+
+AT_CLEANUP