1 # Checking GLR Parsing: Regression Tests -*- Autotest -*-
3 # Copyright (C) 2002-2003, 2005-2007, 2009-2012 Free Software
6 # This program is free software: you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation, either version 3 of the License, or
9 # (at your option) any later version.
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
16 # You should have received a copy of the GNU General Public License
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 AT_BANNER([[GLR Regression Tests]])
21 ## --------------------------- ##
22 ## Badly Collapsed GLR States. ##
23 ## --------------------------- ##
25 AT_SETUP([Badly Collapsed GLR States])
27 AT_BISON_OPTION_PUSHDEFS
28 AT_DATA_GRAMMAR([glr-regr1.y],
29 [[/* Regression Test: Improper state compression */
30 /* Reported by Scott McPeak */
37 static YYSTYPE exprMerge (YYSTYPE x0, YYSTYPE x1);
46 /* -------- productions ------ */
49 StartSymbol: E { $$=0; } %merge <exprMerge>
52 E: E 'P' E { $$=1; printf("E -> E 'P' E\n"); } %merge <exprMerge>
53 | 'B' { $$=2; printf("E -> 'B'\n"); } %merge <exprMerge>
58 /* ---------- C code ----------- */
61 static YYSTYPE exprMerge (YYSTYPE x0, YYSTYPE x1)
88 else if (ch == 'B' || ch == 'P')
93 AT_BISON_OPTION_POPDEFS
95 AT_BISON_CHECK([[-o glr-regr1.c glr-regr1.y]], 0, [],
96 [glr-regr1.y: conflicts: 1 shift/reduce
98 AT_COMPILE([glr-regr1])
99 AT_PARSER_CHECK([[echo BPBPB | ./glr-regr1]], 0,
113 ## ------------------------------------------------------------ ##
114 ## Improper handling of embedded actions and $-N in GLR parsers ##
115 ## ------------------------------------------------------------ ##
117 AT_SETUP([Improper handling of embedded actions and dollar(-N) in GLR parsers])
119 AT_BISON_OPTION_PUSHDEFS
120 AT_DATA_GRAMMAR([glr-regr2a.y],
121 [[/* Regression Test: Improper handling of embedded actions and $-N */
122 /* Reported by S. Eken */
125 #define YYSTYPE char *
141 { printf ("Variable: '%s'\n", $2); }
144 | 's' var_list 't' 'e'
145 { printf ("Varlist: '%s'\n", $2); free ($2); }
146 | 's' var 't' var_printer 'x'
160 char *s = (char *) realloc ($1, strlen ($1) + 1 + strlen ($3) + 1);
169 { printf ("Variable: '%s'\n", $-1); }
182 switch (fscanf (input, " %1[a-z,]", buf))
191 if (fscanf (input, "%49s", buf) != 1)
193 if (sizeof buf - 1 <= strlen (buf))
195 s = (char *) malloc (strlen (buf) + 1);
202 main (int argc, char **argv)
205 if (argc == 2 && !(input = fopen (argv[1], "r"))) return 3;
209 AT_BISON_OPTION_POPDEFS
211 AT_BISON_CHECK([[-o glr-regr2a.c glr-regr2a.y]], 0, [],
212 [glr-regr2a.y: conflicts: 2 shift/reduce
214 AT_COMPILE([glr-regr2a])
216 AT_PARSER_CHECK([[echo s VARIABLE_1 t v x q | ./glr-regr2a]], 0,
217 [[Variable: 'VARIABLE_1'
219 AT_PARSER_CHECK([[echo s VARIABLE_1 , ANOTHER_VARIABLE_2 t e | ./glr-regr2a]],
221 [[Varlist: 'VARIABLE_1,ANOTHER_VARIABLE_2'
223 AT_PARSER_CHECK([[echo s VARIABLE_3 t v x | ./glr-regr2a]], 0,
224 [[Variable: 'VARIABLE_3'
230 ## ------------------------------------------------------------ ##
231 ## Improper merging of GLR delayed action sets ##
232 ## ------------------------------------------------------------ ##
234 AT_SETUP([Improper merging of GLR delayed action sets])
236 AT_BISON_OPTION_PUSHDEFS
237 AT_DATA_GRAMMAR([glr-regr3.y],
238 [[/* Regression Test: Improper merging of GLR delayed action sets. */
239 /* Reported by M. Rosien */
246 static int MergeRule (int x0, int x1);
250 #define RULE(x) (1 << (x))
257 %token P1 P2 T1 T2 T3 T4 O1 O2
261 S : P1 T4 O2 NT6 P2 { printf ("Result: %x\n", $4); }
264 NT1 : P1 T1 O1 T2 P2 { $$ = RULE(2); } %merge<MergeRule>
267 NT2 : NT1 { $$ = RULE(3); } %merge<MergeRule>
268 | P1 NT1 O1 T3 P2 { $$ = RULE(4); } %merge<MergeRule>
271 NT3 : T3 { $$ = RULE(5); } %merge<MergeRule>
272 | P1 NT1 O1 T3 P2 { $$ = RULE(6); } %merge<MergeRule>
275 NT4 : NT3 { $$ = RULE(7); } %merge<MergeRule>
276 | NT2 { $$ = RULE(8); } %merge<MergeRule>
277 | P1 NT2 O1 NT3 P2 { $$ = RULE(9); } %merge<MergeRule>
280 NT5 : NT4 { $$ = RULE(10); } %merge<MergeRule>
283 NT6 : P1 NT1 O1 T3 P2 { $$ = RULE(11) | $2; } %merge<MergeRule>
284 | NT5 { $$ = RULE(12) | $1; } %merge<MergeRule>
290 MergeRule (int x0, int x1)
296 FILE *input = YY_NULL;
298 int P[] = { P1, P2 };
299 int O[] = { O1, O2 };
300 int T[] = { T1, T2, T3, T4 };
307 if (fscanf (input, "%2s", inp) == EOF)
311 case 'p': return P[inp[1] - '1'];
312 case 't': return T[inp[1] - '1'];
313 case 'o': return O[inp[1] - '1'];
319 main(int argc, char* argv[])
322 if (argc == 2 && !(input = fopen (argv[1], "r"))) return 3;
326 AT_BISON_OPTION_POPDEFS
328 AT_BISON_CHECK([[-o glr-regr3.c glr-regr3.y]], 0, [],
329 [glr-regr3.y: conflicts: 1 shift/reduce, 1 reduce/reduce
331 AT_COMPILE([glr-regr3])
333 AT_PARSER_CHECK([[echo p1 t4 o2 p1 p1 t1 o1 t2 p2 o1 t3 p2 p2 | ./glr-regr3]],
341 ## ------------------------------------------------------------------------- ##
342 ## Duplicate representation of merged trees. See ##
343 ## <http://lists.gnu.org/archive/html/help-bison/2005-07/msg00013.html>. ##
344 ## ------------------------------------------------------------------------- ##
346 AT_SETUP([Duplicate representation of merged trees])
348 AT_BISON_OPTION_PUSHDEFS
349 AT_DATA_GRAMMAR([glr-regr4.y],
351 %union { char *ptr; }
352 %type <ptr> S A A1 A2 B
359 static char *merge (YYSTYPE, YYSTYPE);
360 static char *make_value (char const *, char const *);
363 static char *ptrs[100];
364 static char **ptrs_next = ptrs;
369 tree: S { printf ("%s\n", $1); } ;
372 A %merge<merge> { $$ = make_value ("S", $1); }
373 | B %merge<merge> { $$ = make_value ("S", $1); }
377 A1 %merge<merge> { $$ = make_value ("A", $1); }
378 | A2 %merge<merge> { $$ = make_value ("A", $1); }
381 A1: 'a' { $$ = make_value ("A1", "'a'"); } ;
382 A2: 'a' { $$ = make_value ("A2", "'a'"); } ;
383 B: 'a' { $$ = make_value ("B", "'a'"); } ;
387 ]AT_YYLEX_DEFINE([a])[
392 int status = yyparse ();
393 while (ptrs_next != ptrs)
399 make_value (char const *parent, char const *child)
401 char const format[] = "%s <- %s";
402 char *value = *ptrs_next++ =
403 (char *) malloc (strlen (parent) + strlen (child) + sizeof format);
404 sprintf (value, format, parent, child);
409 merge (YYSTYPE s1, YYSTYPE s2)
411 char const format[] = "merge{ %s and %s }";
412 char *value = *ptrs_next++ =
413 (char *) malloc (strlen (s1.ptr) + strlen (s2.ptr) + sizeof format);
414 sprintf (value, format, s1.ptr, s2.ptr);
418 AT_BISON_OPTION_POPDEFS
420 AT_BISON_CHECK([[-o glr-regr4.c glr-regr4.y]], 0, [],
421 [glr-regr4.y: conflicts: 1 reduce/reduce
423 AT_COMPILE([glr-regr4])
425 AT_PARSER_CHECK([[./glr-regr4]], 0,
426 [[merge{ S <- merge{ A <- A1 <- 'a' and A <- A2 <- 'a' } and S <- B <- 'a' }
432 ## -------------------------------------------------------------------------- ##
433 ## User destructor for unresolved GLR semantic value. See ##
434 ## <http://lists.gnu.org/archive/html/bison-patches/2005-08/msg00016.html>. ##
435 ## -------------------------------------------------------------------------- ##
437 AT_SETUP([User destructor for unresolved GLR semantic value])
439 AT_BISON_OPTION_PUSHDEFS
440 AT_DATA_GRAMMAR([glr-regr5.y],
447 enum { MAGIC_VALUE = -1057808125 }; /* originally chosen at random */
451 %union { int value; }
455 if ($$ != MAGIC_VALUE)
457 fprintf (stderr, "Bad destructor call.\n");
465 'a' { $$ = MAGIC_VALUE; }
466 | 'a' { $$ = MAGIC_VALUE; }
475 return yyparse () != 1;
478 AT_BISON_OPTION_POPDEFS
480 AT_BISON_CHECK([[-o glr-regr5.c glr-regr5.y]], 0, [],
481 [glr-regr5.y: conflicts: 1 reduce/reduce
483 AT_COMPILE([glr-regr5])
485 AT_PARSER_CHECK([[./glr-regr5]], 0, [],
492 ## -------------------------------------------------------------------------- ##
493 ## User destructor after an error during a split parse. See ##
494 ## <http://lists.gnu.org/archive/html/bison-patches/2005-08/msg00029.html>. ##
495 ## -------------------------------------------------------------------------- ##
497 AT_SETUP([User destructor after an error during a split parse])
499 AT_BISON_OPTION_PUSHDEFS
500 AT_DATA_GRAMMAR([glr-regr6.y],
510 %union { int value; }
514 printf ("Destructor called.\n");
527 return yyparse () != 1;
530 AT_BISON_OPTION_POPDEFS
532 AT_BISON_CHECK([[-o glr-regr6.c glr-regr6.y]], 0, [],
533 [glr-regr6.y: conflicts: 1 reduce/reduce
535 AT_COMPILE([glr-regr6])
537 AT_PARSER_CHECK([[./glr-regr6]], 0,
546 ## ------------------------------------------------------------------------- ##
547 ## Duplicated user destructor for lookahead. See ##
548 ## <http://lists.gnu.org/archive/html/bison-patches/2005-08/msg00035.html>. ##
549 ## ------------------------------------------------------------------------- ##
551 AT_SETUP([Duplicated user destructor for lookahead])
553 AT_BISON_OPTION_PUSHDEFS
554 AT_DATA_GRAMMAR([glr-regr7.y],
561 #define YYSTACKEXPANDABLE 0
562 typedef struct count_node {
564 struct count_node *prev;
566 static count_node *tail;
570 %union { count_node *node; }
575 fprintf (stderr, "Destructor called on same value twice.\n");
593 yylval.node = (count_node*) malloc (sizeof *yylval.node);
596 fprintf (stderr, "Test inconclusive.\n");
599 yylval.node->count = 0;
600 yylval.node->prev = tail;
609 int status = yyparse ();
612 count_node *prev = tail->prev;
619 AT_BISON_OPTION_POPDEFS
621 AT_BISON_CHECK([[-o glr-regr7.c glr-regr7.y]], 0, [],
622 [glr-regr7.y: conflicts: 2 reduce/reduce
624 AT_COMPILE([glr-regr7])
626 AT_PARSER_CHECK([[./glr-regr7]], 2, [],
633 ## ------------------------------------------------------------------------- ##
634 ## Incorrect default location for empty right-hand sides. Adapted from bug ##
635 ## report by Claudia Hermann. ##
636 ## See http://lists.gnu.org/archive/html/bug-bison/2005-10/msg00069.html and ##
637 ## http://lists.gnu.org/archive/html/bug-bison/2005-10/msg00072.html ##
638 ## ------------------------------------------------------------------------- ##
640 AT_SETUP([Incorrectly initialized location for empty right-hand side in GLR])
642 AT_BISON_OPTION_PUSHDEFS
643 AT_DATA_GRAMMAR([glr-regr8.y],
661 PortClause : T_PORT InterfaceDeclaration T_PORT
662 { printf("%d/%d - %d/%d - %d/%d\n",
663 @1.first_column, @1.last_column,
664 @2.first_column, @2.last_column,
665 @3.first_column, @3.last_column); }
668 InterfaceDeclaration : OptConstantWord %dprec 1
669 | OptSignalWord %dprec 2
672 OptConstantWord : /* empty */
676 OptSignalWord : /* empty */
677 { printf("empty: %d/%d\n", @$.first_column, @$.last_column); }
694 yylloc.first_column = 1;
695 yylloc.last_column = 9;
698 yylloc.first_column = 13;
699 yylloc.last_column = 17;
713 AT_BISON_OPTION_POPDEFS
715 AT_BISON_CHECK([[-o glr-regr8.c glr-regr8.y]], 0, [],
716 [glr-regr8.y: conflicts: 1 reduce/reduce
718 AT_COMPILE([glr-regr8])
720 AT_PARSER_CHECK([[./glr-regr8]], 0,
729 ## ------------------------------------------------------------------------- ##
730 ## No users destructors if stack 0 deleted. See ##
731 ## <http://lists.gnu.org/archive/html/bison-patches/2005-09/msg00109.html>. ##
732 ## ------------------------------------------------------------------------- ##
734 AT_SETUP([No users destructors if stack 0 deleted])
736 AT_BISON_OPTION_PUSHDEFS
737 AT_DATA_GRAMMAR([glr-regr9.y],
744 # define YYSTACKEXPANDABLE 0
745 static int tokens = 0;
746 static int destructors = 0;
751 %union { int dummy; }
761 ambig0 'a' { destructors += 2; USE ($2); }
762 | ambig1 start { destructors += 1; }
763 | ambig2 start { destructors += 1; }
784 exit_status = yyparse ();
785 if (tokens != destructors)
787 fprintf (stderr, "Tokens = %d, Destructors = %d\n", tokens, destructors);
793 AT_BISON_OPTION_POPDEFS
795 AT_BISON_CHECK([[-o glr-regr9.c glr-regr9.y]], 0, [],
796 [glr-regr9.y: conflicts: 1 reduce/reduce
798 AT_COMPILE([glr-regr9])
800 AT_PARSER_CHECK([[./glr-regr9]], 0, [],
807 ## ------------------------------------------------------------------------- ##
808 ## Corrupted semantic options if user action cuts parse. ##
809 ## ------------------------------------------------------------------------- ##
811 AT_SETUP([Corrupted semantic options if user action cuts parse])
813 AT_BISON_OPTION_PUSHDEFS
814 AT_DATA_GRAMMAR([glr-regr10.y],
821 #define GARBAGE_SIZE 50
822 static char garbage[GARBAGE_SIZE];
826 %union { char *ptr; }
832 %dprec 2 { $$ = garbage; YYACCEPT; }
833 | %dprec 1 { $$ = garbage; YYACCEPT; }
844 for (i = 0; i < GARBAGE_SIZE; i+=1)
849 AT_BISON_OPTION_POPDEFS
851 AT_BISON_CHECK([[-o glr-regr10.c glr-regr10.y]], 0, [],
852 [glr-regr10.y: conflicts: 1 reduce/reduce
854 AT_COMPILE([glr-regr10])
856 AT_PARSER_CHECK([[./glr-regr10]], 0, [], [])
861 ## ------------------------------------------------------------------------- ##
862 ## Undesirable destructors if user action cuts parse. ##
863 ## ------------------------------------------------------------------------- ##
865 AT_SETUP([Undesirable destructors if user action cuts parse])
867 AT_BISON_OPTION_PUSHDEFS
868 AT_DATA_GRAMMAR([glr-regr11.y],
874 static int destructors = 0;
879 %union { int dummy; }
881 %destructor { destructors += 1; } 'a'
886 'a' %dprec 2 { USE ($1); destructors += 1; YYACCEPT; }
887 | 'a' %dprec 1 { USE ($1); destructors += 1; YYACCEPT; }
893 ]AT_YYLEX_DEFINE([a])[
898 int exit_status = yyparse ();
899 if (destructors != 1)
901 fprintf (stderr, "Destructor calls: %d\n", destructors);
907 AT_BISON_OPTION_POPDEFS
909 AT_BISON_CHECK([[-o glr-regr11.c glr-regr11.y]], 0, [],
910 [glr-regr11.y: conflicts: 1 reduce/reduce
912 AT_COMPILE([glr-regr11])
914 AT_PARSER_CHECK([[./glr-regr11]], 0, [], [])
919 ## ------------------------------------------------------------------------- ##
920 ## Leaked semantic values if user action cuts parse. ##
921 ## ------------------------------------------------------------------------- ##
923 AT_SETUP([Leaked semantic values if user action cuts parse])
925 AT_BISON_OPTION_PUSHDEFS
926 AT_DATA_GRAMMAR([glr-regr12.y],
929 %union { int dummy; }
930 %token PARENT_RHS_AFTER
931 %type <dummy> parent_rhs_before merged PARENT_RHS_AFTER
932 %destructor { parent_rhs_before_value = 0; } parent_rhs_before
933 %destructor { merged_value = 0; } merged
934 %destructor { parent_rhs_after_value = 0; } PARENT_RHS_AFTER
938 static int merge (YYSTYPE, YYSTYPE);
941 static int parent_rhs_before_value = 0;
942 static int merged_value = 0;
943 static int parent_rhs_after_value = 0;
957 parent_rhs_after_value = 0;
962 parent_rhs_before merged PARENT_RHS_AFTER {
964 parent_rhs_before_value = 0;
966 parent_rhs_after_value = 0;
973 parent_rhs_before_value = 1;
982 | cut %merge<merge> {
993 merge (YYSTYPE s1, YYSTYPE s2)
996 char dummy = s1.dummy + s2.dummy;
1004 static int const input[] = { PARENT_RHS_AFTER, 0 };
1005 static size_t toknum;
1006 if (! (toknum < sizeof input / sizeof *input))
1008 if (input[toknum] == PARENT_RHS_AFTER)
1009 parent_rhs_after_value = 1;
1010 return input[toknum++];
1016 int exit_status = yyparse ();
1017 if (parent_rhs_before_value)
1019 fprintf (stderr, "`parent_rhs_before' destructor not called.\n");
1024 fprintf (stderr, "`merged' destructor not called.\n");
1027 if (parent_rhs_after_value)
1029 fprintf (stderr, "`PARENT_RHS_AFTER' destructor not called.\n");
1035 AT_BISON_OPTION_POPDEFS
1037 AT_BISON_CHECK([[-o glr-regr12.c glr-regr12.y]], 0, [],
1038 [glr-regr12.y: conflicts: 1 shift/reduce, 1 reduce/reduce
1040 AT_COMPILE([glr-regr12])
1042 AT_PARSER_CHECK([[./glr-regr12]], 0, [], [])
1047 ## ------------------------------------------------------------------------- ##
1048 ## Incorrect lookahead during deterministic GLR. See ##
1049 ## <http://lists.gnu.org/archive/html/help-bison/2005-07/msg00017.html> and ##
1050 ## <http://lists.gnu.org/archive/html/bison-patches/2006-01/msg00060.html>. ##
1051 ## ------------------------------------------------------------------------- ##
1053 AT_SETUP([Incorrect lookahead during deterministic GLR])
1055 AT_BISON_OPTION_PUSHDEFS
1056 AT_DATA_GRAMMAR([glr-regr13.y],
1059 - Defaulted state with initial yychar: yychar == YYEMPTY.
1060 - Nondefaulted state: yychar != YYEMPTY.
1061 - Defaulted state after lookahead: yychar != YYEMPTY.
1062 - Defaulted state after shift: yychar == YYEMPTY.
1063 - User action changing the lookahead. */
1067 ]AT_YYERROR_DECLARE[
1069 static void print_lookahead (char const *);
1073 %union { char value; }
1074 %type <value> 'a' 'b'
1081 defstate_init defstate_shift 'b' change_lookahead 'a' {
1083 print_lookahead ("start <- defstate_init defstate_shift 'b'");
1088 print_lookahead ("defstate_init <- empty string");
1092 nondefstate defstate_look 'a' {
1094 print_lookahead ("defstate_shift <- nondefstate defstate_look 'a'");
1099 print_lookahead ("defstate_look <- empty string");
1104 print_lookahead ("nondefstate <- empty string");
1108 print_lookahead ("nondefstate <- 'b'");
1123 static char const input[] = "ab";
1124 static size_t toknum;
1125 if (! (toknum < sizeof input))
1127 yylloc.first_line = yylloc.last_line = 1;
1128 yylloc.first_column = yylloc.last_column = toknum + 1;
1129 yylval.value = input[toknum] + 'A' - 'a';
1130 return input[toknum++];
1134 print_lookahead (char const *reduction)
1136 printf ("%s:\n yychar=", reduction);
1137 if (yychar == YYEMPTY)
1139 else if (yychar == YYEOF)
1143 printf ("'%c', yylval='", yychar);
1144 if (yylval.value > ' ')
1145 printf ("%c", yylval.value);
1146 printf ("', yylloc=(%d,%d),(%d,%d)",
1147 yylloc.first_line, yylloc.first_column,
1148 yylloc.last_line, yylloc.last_column);
1156 yychar = '#'; /* Not a token in the grammar. */
1161 AT_BISON_OPTION_POPDEFS
1163 AT_BISON_CHECK([[-o glr-regr13.c glr-regr13.y]], 0, [], [])
1164 AT_COMPILE([glr-regr13])
1166 AT_PARSER_CHECK([[./glr-regr13]], 0,
1167 [defstate_init <- empty string:
1169 nondefstate <- empty string:
1170 yychar='a', yylval='A', yylloc=(1,1),(1,1)
1171 defstate_look <- empty string:
1172 yychar='a', yylval='A', yylloc=(1,1),(1,1)
1173 defstate_shift <- nondefstate defstate_look 'a':
1175 start <- defstate_init defstate_shift 'b':
1182 ## ------------------------------------------------------------------------- ##
1183 ## Incorrect lookahead during nondeterministic GLR. ##
1184 ## ------------------------------------------------------------------------- ##
1186 AT_SETUP([Incorrect lookahead during nondeterministic GLR])
1188 AT_BISON_OPTION_PUSHDEFS
1189 AT_DATA_GRAMMAR([glr-regr14.y],
1192 - Conflicting actions (split-off parse, which copies lookahead need,
1193 which is necessarily yytrue) and nonconflicting actions (non-split-off
1194 parse) for nondefaulted state: yychar != YYEMPTY.
1195 - Merged deferred actions (lookahead need and RHS from different stack
1196 than the target state) and nonmerged deferred actions (same stack).
1197 - Defaulted state after lookahead: yychar != YYEMPTY.
1198 - Defaulted state after shift: yychar == YYEMPTY.
1199 - yychar != YYEMPTY but lookahead need is yyfalse (a previous stack has
1200 seen the lookahead but current stack has not).
1201 - Exceeding stack capacity (stack explosion), and thus reallocating
1202 lookahead need array.
1203 Note that it does not seem possible to see the initial yychar value during
1204 nondeterministic operation since:
1205 - In order to preserve the initial yychar, only defaulted states may be
1207 - If only defaulted states are entered, there are no conflicts, so
1208 nondeterministic operation does not start. */
1210 %union { char value; }
1215 ]AT_YYERROR_DECLARE[
1217 static void print_lookahead (char const *);
1218 static char merge (union YYSTYPE, union YYSTYPE);
1222 %type <value> 'a' 'b' 'c' 'd' stack_explosion
1229 merge 'c' stack_explosion {
1231 print_lookahead ("start <- merge 'c' stack_explosion");
1235 /* When merging the 2 deferred actions, the lookahead needs are different. */
1237 nonconflict1 'a' 'b' nonconflict2 %dprec 1 {
1239 print_lookahead ("merge <- nonconflict1 'a' 'b' nonconflict2");
1241 | conflict defstate_look 'a' nonconflict2 'b' defstate_shift %dprec 2 {
1243 print_lookahead ("merge <- conflict defstate_look 'a' nonconflict2 'b'"
1250 print_lookahead ("nonconflict1 <- empty string");
1255 print_lookahead ("nonconflict2 <- empty string");
1259 print_lookahead ("nonconflict2 <- 'a'");
1264 print_lookahead ("conflict <- empty string");
1269 print_lookahead ("defstate_look <- empty string");
1273 /* yychar != YYEMPTY but lookahead need is yyfalse. */
1276 print_lookahead ("defstate_shift <- empty string");
1282 | alt1 stack_explosion %merge<merge> { $$ = $2; }
1283 | alt2 stack_explosion %merge<merge> { $$ = $2; }
1284 | alt3 stack_explosion %merge<merge> { $$ = $2; }
1289 if (yychar != 'd' && yychar != YYEOF)
1291 fprintf (stderr, "Incorrect lookahead during stack explosion.\n");
1298 if (yychar != 'd' && yychar != YYEOF)
1300 fprintf (stderr, "Incorrect lookahead during stack explosion.\n");
1307 if (yychar != 'd' && yychar != YYEOF)
1309 fprintf (stderr, "Incorrect lookahead during stack explosion.\n");
1315 if (yychar != YYEMPTY)
1318 "Found lookahead where shouldn't during stack explosion.\n");
1329 static char const input[] = "abcdddd";
1330 static size_t toknum;
1331 if (! (toknum < sizeof input))
1333 yylloc.first_line = yylloc.last_line = 1;
1334 yylloc.first_column = yylloc.last_column = toknum + 1;
1335 yylval.value = input[toknum] + 'A' - 'a';
1336 return input[toknum++];
1340 print_lookahead (char const *reduction)
1342 printf ("%s:\n yychar=", reduction);
1343 if (yychar == YYEMPTY)
1345 else if (yychar == YYEOF)
1349 printf ("'%c', yylval='", yychar);
1350 if (yylval.value > ' ')
1351 printf ("%c", yylval.value);
1352 printf ("', yylloc=(%d,%d),(%d,%d)",
1353 yylloc.first_line, yylloc.first_column,
1354 yylloc.last_line, yylloc.last_column);
1360 merge (union YYSTYPE s1, union YYSTYPE s2)
1362 char dummy = s1.value + s2.value;
1369 yychar = '#'; /* Not a token in the grammar. */
1374 AT_BISON_OPTION_POPDEFS
1376 AT_BISON_CHECK([[-o glr-regr14.c glr-regr14.y]], 0, [],
1377 [glr-regr14.y: conflicts: 3 reduce/reduce
1379 AT_COMPILE([glr-regr14])
1381 AT_PARSER_CHECK([[./glr-regr14]], 0,
1382 [conflict <- empty string:
1383 yychar='a', yylval='A', yylloc=(1,1),(1,1)
1384 defstate_look <- empty string:
1385 yychar='a', yylval='A', yylloc=(1,1),(1,1)
1386 nonconflict2 <- empty string:
1387 yychar='b', yylval='B', yylloc=(1,2),(1,2)
1388 defstate_shift <- empty string:
1390 merge <- conflict defstate_look 'a' nonconflict2 'b' defstate_shift:
1392 start <- merge 'c' stack_explosion:
1399 ## ------------------------------------------------------------------------- ##
1400 ## Leaked semantic values when reporting ambiguity. ##
1401 ## ------------------------------------------------------------------------- ##
1403 AT_SETUP([Leaked semantic values when reporting ambiguity])
1405 AT_BISON_OPTION_PUSHDEFS
1406 AT_DATA_GRAMMAR([glr-regr15.y],
1409 %destructor { parent_rhs_before_value = 0; } parent_rhs_before
1412 # include <stdlib.h>
1413 ]AT_YYERROR_DECLARE[
1415 static int parent_rhs_before_value = 0;
1426 /* This stack must be merged into the other stacks *last* (added at the
1427 beginning of the semantic options list) so that yyparse will choose to clean
1428 it up rather than the tree for which some semantic actions have been
1429 performed. Thus, if yyreportAmbiguity longjmp's to yyparse, the values from
1430 those other trees are not cleaned up. */
1434 parent_rhs_before ambiguity {
1436 parent_rhs_before_value = 0;
1443 parent_rhs_before_value = 1;
1447 ambiguity: ambiguity1 | ambiguity2 ;
1458 int exit_status = yyparse () != 1;
1459 if (parent_rhs_before_value)
1461 fprintf (stderr, "`parent_rhs_before' destructor not called.\n");
1467 AT_BISON_OPTION_POPDEFS
1469 AT_BISON_CHECK([[-o glr-regr15.c glr-regr15.y]], 0, [],
1470 [glr-regr15.y: conflicts: 2 reduce/reduce
1472 AT_COMPILE([glr-regr15])
1474 AT_PARSER_CHECK([[./glr-regr15]], 0, [],
1475 [syntax is ambiguous
1481 ## ------------------------------------------------------------------------- ##
1482 ## Leaked lookahead after nondeterministic parse syntax error. ##
1483 ## ------------------------------------------------------------------------- ##
1485 AT_SETUP([Leaked lookahead after nondeterministic parse syntax error])
1487 AT_BISON_OPTION_PUSHDEFS
1488 AT_DATA_GRAMMAR([glr-regr16.y],
1491 %destructor { lookahead_value = 0; } 'b'
1494 # include <stdlib.h>
1495 ]AT_YYERROR_DECLARE[
1497 static int lookahead_value = 0;
1503 start: alt1 'a' | alt2 'a' ;
1513 static char const input[] = "ab";
1514 static size_t toknum;
1515 if (! (toknum < sizeof input))
1517 if (input[toknum] == 'b')
1518 lookahead_value = 1;
1519 return input[toknum++];
1525 int exit_status = yyparse () != 1;
1526 if (lookahead_value)
1528 fprintf (stderr, "Lookahead destructor not called.\n");
1534 AT_BISON_OPTION_POPDEFS
1536 AT_BISON_CHECK([[-o glr-regr16.c glr-regr16.y]], 0, [],
1537 [glr-regr16.y: conflicts: 1 reduce/reduce
1539 AT_COMPILE([glr-regr16])
1541 AT_PARSER_CHECK([[./glr-regr16]], 0, [],
1548 ## ------------------------------------------------------------------------- ##
1549 ## Uninitialized location when reporting ambiguity. ##
1550 ## ------------------------------------------------------------------------- ##
1552 AT_SETUP([Uninitialized location when reporting ambiguity])
1554 AT_BISON_OPTION_PUSHDEFS
1555 AT_DATA_GRAMMAR([glr-regr17.y],
1562 %union { int dummy; }
1565 static void yyerror (YYLTYPE *, char const *);
1566 static int yylex (YYSTYPE *, YYLTYPE *);
1571 @$.first_column = 1;
1578 /* Tests the case of an empty RHS that has inherited the location of the
1579 previous nonterminal, which is unresolved. That location is reported as the
1580 last position of the ambiguity. */
1581 start: ambig1 empty1 | ambig2 empty2 ;
1583 /* Tests multiple levels of yyresolveLocations recursion. */
1584 ambig1: sub_ambig1 | sub_ambig2 ;
1585 ambig2: sub_ambig1 | sub_ambig2 ;
1587 /* Tests the case of a non-empty RHS as well as the case of an empty RHS that
1588 has inherited the initial location. The empty RHS's location is reported as
1589 the first position in the ambiguity. */
1590 sub_ambig1: empty1 'a' 'b' ;
1591 sub_ambig2: empty2 'a' 'b' ;
1598 yyerror (YYLTYPE *locp, char const *msg)
1600 fprintf (stderr, "%d.%d-%d.%d: %s.\n", locp->first_line,
1601 locp->first_column, locp->last_line, locp->last_column, msg);
1605 yylex (YYSTYPE *lvalp, YYLTYPE *llocp)
1607 static char const input[] = "ab";
1608 static size_t toknum;
1609 if (! (toknum < sizeof input))
1612 llocp->first_line = llocp->last_line = 2;
1613 llocp->first_column = toknum + 1;
1614 llocp->last_column = llocp->first_column + 1;
1615 return input[toknum++];
1621 return yyparse () != 1;
1624 AT_BISON_OPTION_POPDEFS
1626 AT_BISON_CHECK([[-o glr-regr17.c glr-regr17.y]], 0, [],
1627 [glr-regr17.y: conflicts: 3 reduce/reduce
1629 AT_COMPILE([glr-regr17])
1631 AT_PARSER_CHECK([[./glr-regr17]], 0, [],
1632 [1.1-2.3: syntax is ambiguous.
1638 ## -------------------------------------------------------------##
1639 ## Missed %merge type warnings when LHS type is declared later. ##
1640 ## -------------------------------------------------------------##
1642 AT_SETUP([Missed %merge type warnings when LHS type is declared later])
1644 AT_BISON_OPTION_PUSHDEFS
1645 AT_DATA_GRAMMAR([glr-regr18.y],
1650 ]AT_YYERROR_DECLARE[
1662 sym1: sym2 %merge<merge> { $$ = $1; } ;
1663 sym2: sym3 %merge<merge> { $$ = $1; } ;
1664 sym3: %merge<merge> { $$ = 0; } ;
1679 AT_BISON_OPTION_POPDEFS
1681 AT_BISON_CHECK([[-o glr-regr18.c glr-regr18.y]], 1, [],
1682 [glr-regr18.y:26.18-24: result type clash on merge function 'merge': <type2> != <type1>
1683 glr-regr18.y:25.18-24: previous declaration
1684 glr-regr18.y:27.13-19: result type clash on merge function 'merge': <type3> != <type2>
1685 glr-regr18.y:26.18-24: previous declaration
1691 ## ------------------- ##
1692 ## Ambiguity reports. ##
1693 ## ------------------- ##
1695 AT_SETUP([Ambiguity reports])
1697 AT_BISON_OPTION_PUSHDEFS
1698 AT_DATA_GRAMMAR([input.y],
1703 ]AT_YYERROR_DECLARE[
1718 ]AT_YYLEX_DEFINE([abc])[
1724 return !!yyparse ();
1727 AT_BISON_OPTION_POPDEFS
1729 AT_BISON_CHECK([[-o input.c input.y]], 0, [],
1730 [input.y: conflicts: 1 reduce/reduce
1734 AT_PARSER_CHECK([[./input]], 1, [],
1737 Reading a token: Next token is token 'a' ()
1738 Shifting token 'a' ()
1740 Reading a token: Next token is token 'b' ()
1741 Shifting token 'b' ()
1743 Reducing stack 0 by rule 3 (line 25):
1747 Reading a token: Next token is token 'c' ()
1748 Shifting token 'c' ()
1750 Reducing stack 0 by rule 4 (line 26):
1753 Reading a token: Now at end of input.
1754 Stack 0 Entering state 7
1755 Now at end of input.
1756 Splitting off stack 1 from 0.
1757 Reduced stack 1 by rule #2; action deferred. Now in state 2.
1758 Stack 1 Entering state 2
1759 Now at end of input.
1760 Reduced stack 0 by rule #1; action deferred. Now in state 2.
1761 Merging stack 0 into stack 1.
1762 Stack 1 Entering state 2
1763 Now at end of input.
1764 Removing dead stacks.
1765 Rename stack 1 -> 0.
1766 On stack 0, shifting token $end ()
1767 Stack 0 now in state #5
1770 start -> <Rule 1, tokens 1 .. 3>
1777 start -> <Rule 2, tokens 1 .. 3>
1784 Cleanup: popping token $end ()
1785 Cleanup: popping unresolved nterm start ()
1786 Cleanup: popping nterm d ()
1787 Cleanup: popping token 'c' ()
1788 Cleanup: popping nterm b ()
1789 Cleanup: popping token 'a' ()