1 # Checking GLR Parsing: Regression Tests -*- Autotest -*-
2 # Copyright (C) 2002, 2003, 2005, 2006 Free Software Foundation, Inc.
4 # This program is free software; you can redistribute it and/or modify
5 # it under the terms of the GNU General Public License as published by
6 # the Free Software Foundation; either version 2, or (at your option)
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 AT_BANNER([[GLR Regression Tests]])
21 ## --------------------------- ##
22 ## Badly Collapsed GLR States. ##
23 ## --------------------------- ##
25 AT_SETUP([Badly Collapsed GLR States])
27 AT_DATA_GRAMMAR([glr-regr1.y],
28 [[/* Regression Test: Improper state compression */
29 /* Reported by Scott McPeak */
35 static YYSTYPE exprMerge (YYSTYPE x0, YYSTYPE x1);
37 void yyerror (char const *msg);
44 /* -------- productions ------ */
47 StartSymbol: E { $$=0; } %merge <exprMerge>
50 E: E 'P' E { $$=1; printf("E -> E 'P' E\n"); } %merge <exprMerge>
51 | 'B' { $$=2; printf("E -> 'B'\n"); } %merge <exprMerge>
56 /* ---------- C code ----------- */
59 static YYSTYPE exprMerge (YYSTYPE x0, YYSTYPE x1)
74 yyerror (char const *msg)
76 fprintf (stderr, "%s\n", msg);
88 else if (ch == 'B' || ch == 'P')
94 AT_CHECK([[bison -o glr-regr1.c glr-regr1.y]], 0, [],
95 [glr-regr1.y: conflicts: 1 shift/reduce
97 AT_COMPILE([glr-regr1])
98 AT_CHECK([[echo BPBPB | ./glr-regr1]], 0,
112 ## ------------------------------------------------------------ ##
113 ## Improper handling of embedded actions and $-N in GLR parsers ##
114 ## ------------------------------------------------------------ ##
116 AT_SETUP([Improper handling of embedded actions and dollar(-N) in GLR parsers])
118 AT_DATA_GRAMMAR([glr-regr2a.y],
119 [[/* Regression Test: Improper handling of embedded actions and $-N */
120 /* Reported by S. Eken */
123 #define YYSTYPE char *
130 void yyerror (char const *);
139 { printf ("Variable: '%s'\n", $2); }
142 | 's' var_list 't' 'e'
143 { printf ("Varlist: '%s'\n", $2); free ($2); }
144 | 's' var 't' var_printer 'x'
158 char *s = (char *) realloc ($1, strlen ($1) + 1 + strlen ($3) + 1);
167 { printf ("Variable: '%s'\n", $-1); }
178 switch (fscanf (input, " %1[a-z,]", buf)) {
186 if (fscanf (input, "%49s", buf) != 1)
188 if (sizeof buf - 1 <= strlen (buf))
190 s = (char *) malloc (strlen (buf) + 1);
197 yyerror (char const *s)
198 { printf ("%s\n", s);
202 main (int argc, char **argv)
205 if (argc == 2 && !(input = fopen (argv[1], "r"))) return 3;
210 AT_CHECK([[bison -o glr-regr2a.c glr-regr2a.y]], 0, [],
211 [glr-regr2a.y: conflicts: 2 shift/reduce
213 AT_COMPILE([glr-regr2a])
215 AT_CHECK([[echo s VARIABLE_1 t v x q | ./glr-regr2a]], 0,
216 [[Variable: 'VARIABLE_1'
218 AT_CHECK([[echo s VARIABLE_1 , ANOTHER_VARIABLE_2 t e | ./glr-regr2a]], 0,
219 [[Varlist: 'VARIABLE_1,ANOTHER_VARIABLE_2'
221 AT_CHECK([[echo s VARIABLE_3 t v x | ./glr-regr2a]], 0,
222 [[Variable: 'VARIABLE_3'
228 ## ------------------------------------------------------------ ##
229 ## Improper merging of GLR delayed action sets ##
230 ## ------------------------------------------------------------ ##
232 AT_SETUP([Improper merging of GLR delayed action sets])
234 AT_DATA_GRAMMAR([glr-regr3.y],
235 [[/* Regression Test: Improper merging of GLR delayed action sets. */
236 /* Reported by M. Rosien */
242 static int MergeRule (int x0, int x1);
243 static void yyerror (char const * s);
246 #define RULE(x) (1 << (x))
253 %token P1 P2 T1 T2 T3 T4 O1 O2
257 S : P1 T4 O2 NT6 P2 { printf ("Result: %x\n", $4); }
260 NT1 : P1 T1 O1 T2 P2 { $$ = RULE(2); } %merge<MergeRule>
263 NT2 : NT1 { $$ = RULE(3); } %merge<MergeRule>
264 | P1 NT1 O1 T3 P2 { $$ = RULE(4); } %merge<MergeRule>
267 NT3 : T3 { $$ = RULE(5); } %merge<MergeRule>
268 | P1 NT1 O1 T3 P2 { $$ = RULE(6); } %merge<MergeRule>
271 NT4 : NT3 { $$ = RULE(7); } %merge<MergeRule>
272 | NT2 { $$ = RULE(8); } %merge<MergeRule>
273 | P1 NT2 O1 NT3 P2 { $$ = RULE(9); } %merge<MergeRule>
276 NT5 : NT4 { $$ = RULE(10); } %merge<MergeRule>
279 NT6 : P1 NT1 O1 T3 P2 { $$ = RULE(11) | $2; } %merge<MergeRule>
280 | NT5 { $$ = RULE(12) | $1; } %merge<MergeRule>
285 static int MergeRule (int x0, int x1) {
289 static void yyerror(char const * s) {
290 fprintf(stderr,"error: %s\n",s);
295 int P[] = { P1, P2 };
296 int O[] = { O1, O2 };
297 int T[] = { T1, T2, T3, T4 };
302 if (fscanf (input, "%2s", inp) == EOF)
306 case 'p': return P[inp[1] - '1'];
307 case 't': return T[inp[1] - '1'];
308 case 'o': return O[inp[1] - '1'];
313 int main(int argc, char* argv[]) {
315 if (argc == 2 && !(input = fopen (argv[1], "r"))) return 3;
320 AT_CHECK([[bison -o glr-regr3.c glr-regr3.y]], 0, [],
321 [glr-regr3.y: conflicts: 1 shift/reduce, 1 reduce/reduce
323 AT_COMPILE([glr-regr3])
325 AT_CHECK([[echo p1 t4 o2 p1 p1 t1 o1 t2 p2 o1 t3 p2 p2 | ./glr-regr3]], 0,
332 ## ------------------------------------------------------------------------- ##
333 ## Duplicate representation of merged trees. See ##
334 ## <http://lists.gnu.org/archive/html/help-bison/2005-07/msg00013.html>. ##
335 ## ------------------------------------------------------------------------- ##
337 AT_SETUP([Duplicate representation of merged trees])
339 AT_DATA_GRAMMAR([glr-regr4.y],
341 %union { char *ptr; }
342 %type <ptr> S A A1 A2 B
349 static char *merge (YYSTYPE, YYSTYPE);
350 static char *make_value (char const *, char const *);
351 static void yyerror (char const *);
352 static int yylex (void);
357 tree: S { printf ("%s\n", $1); } ;
360 A %merge<merge> { $$ = make_value ("S", $1); }
361 | B %merge<merge> { $$ = make_value ("S", $1); }
365 A1 %merge<merge> { $$ = make_value ("A", $1); }
366 | A2 %merge<merge> { $$ = make_value ("A", $1); }
369 A1: 'a' { $$ = make_value ("A1", "'a'"); } ;
370 A2: 'a' { $$ = make_value ("A2", "'a'"); } ;
371 B: 'a' { $$ = make_value ("B", "'a'"); } ;
378 static char const *input = "a";
389 make_value (char const *parent, char const *child)
391 char const format[] = "%s <- %s";
393 (char *) malloc (strlen (parent) + strlen (child) + sizeof format);
394 sprintf (value, format, parent, child);
399 merge (YYSTYPE s1, YYSTYPE s2)
401 char const format[] = "merge{ %s and %s }";
403 (char *) malloc (strlen (s1.ptr) + strlen (s2.ptr) + sizeof format);
404 sprintf (value, format, s1.ptr, s2.ptr);
409 yyerror (char const *msg)
411 fprintf (stderr, "%s\n", msg);
415 AT_CHECK([[bison -o glr-regr4.c glr-regr4.y]], 0, [],
416 [glr-regr4.y: conflicts: 1 reduce/reduce
418 AT_COMPILE([glr-regr4])
420 AT_CHECK([[./glr-regr4]], 0,
421 [[merge{ S <- merge{ A <- A1 <- 'a' and A <- A2 <- 'a' } and S <- B <- 'a' }
427 ## -------------------------------------------------------------------------- ##
428 ## User destructor for unresolved GLR semantic value. See ##
429 ## <http://lists.gnu.org/archive/html/bison-patches/2005-08/msg00016.html>. ##
430 ## -------------------------------------------------------------------------- ##
432 AT_SETUP([User destructor for unresolved GLR semantic value])
434 AT_DATA_GRAMMAR([glr-regr5.y],
439 static void yyerror (char const *);
440 static int yylex (void);
441 enum { MAGIC_VALUE = -1057808125 }; /* originally chosen at random */
445 %union { int value; }
449 if ($$ != MAGIC_VALUE)
451 fprintf (stderr, "Bad destructor call.\n");
459 'a' { $$ = MAGIC_VALUE; }
460 | 'a' { $$ = MAGIC_VALUE; }
468 static char const *input = "a";
473 yyerror (char const *msg)
475 fprintf (stderr, "%s\n", msg);
481 return yyparse () != 1;
485 AT_CHECK([[bison -o glr-regr5.c glr-regr5.y]], 0, [],
486 [glr-regr5.y: conflicts: 1 reduce/reduce
488 AT_COMPILE([glr-regr5])
490 AT_CHECK([[./glr-regr5]], 0, [],
497 ## -------------------------------------------------------------------------- ##
498 ## User destructor after an error during a split parse. See ##
499 ## <http://lists.gnu.org/archive/html/bison-patches/2005-08/msg00029.html>. ##
500 ## -------------------------------------------------------------------------- ##
502 AT_SETUP([User destructor after an error during a split parse])
504 AT_DATA_GRAMMAR([glr-regr6.y],
509 static void yyerror (char const *);
510 static int yylex (void);
514 %union { int value; }
518 printf ("Destructor called.\n");
530 static char const *input = "a";
535 yyerror (char const *msg)
537 fprintf (stderr, "%s\n", msg);
543 return yyparse () != 1;
547 AT_CHECK([[bison -o glr-regr6.c glr-regr6.y]], 0, [],
548 [glr-regr6.y: conflicts: 1 reduce/reduce
550 AT_COMPILE([glr-regr6])
552 AT_CHECK([[./glr-regr6]], 0,
561 ## ------------------------------------------------------------------------- ##
562 ## Duplicated user destructor for lookahead. See ##
563 ## <http://lists.gnu.org/archive/html/bison-patches/2005-08/msg00035.html>. ##
564 ## ------------------------------------------------------------------------- ##
566 AT_SETUP([Duplicated user destructor for lookahead])
568 AT_DATA_GRAMMAR([glr-regr7.y],
573 static void yyerror (char const *);
574 static int yylex (void);
575 #define YYSTACKEXPANDABLE 0
579 %union { int *count; }
584 fprintf (stderr, "Destructor called on same value twice.\n");
602 yylval.count = (int *) malloc (sizeof (int));
605 fprintf (stderr, "Test inconclusive.\n");
613 yyerror (char const *msg)
615 fprintf (stderr, "%s\n", msg);
625 AT_CHECK([[bison -o glr-regr7.c glr-regr7.y]], 0, [],
626 [glr-regr7.y: conflicts: 2 reduce/reduce
628 AT_COMPILE([glr-regr7])
630 AT_CHECK([[./glr-regr7]], 2, [],
637 ## ------------------------------------------------------------------------- ##
638 ## Incorrect default location for empty right-hand sides. Adapted from bug ##
639 ## report by Claudia Hermann. ##
640 ## See http://lists.gnu.org/archive/html/bug-bison/2005-10/msg00069.html and ##
641 ## http://lists.gnu.org/archive/html/bug-bison/2005-10/msg00072.html ##
642 ## ------------------------------------------------------------------------- ##
644 AT_SETUP([Incorrectly initialized location for empty right-hand side in GLR])
646 AT_DATA_GRAMMAR([glr-regr8.y],
651 static void yyerror (char const *);
652 static int yylex (void);
653 static void yyerror (char const *msg);
665 PortClause : T_PORT InterfaceDeclaration T_PORT
666 { printf("%d/%d - %d/%d - %d/%d\n",
667 @1.first_column, @1.last_column,
668 @2.first_column, @2.last_column,
669 @3.first_column, @3.last_column); }
672 InterfaceDeclaration : OptConstantWord %dprec 1
673 | OptSignalWord %dprec 2
676 OptConstantWord : /* empty */
680 OptSignalWord : /* empty */
681 { printf("empty: %d/%d\n", @$.first_column, @$.last_column); }
688 yyerror (char const *msg)
690 fprintf (stderr, "%s\n", msg);
701 yylloc.first_column = 1;
702 yylloc.last_column = 9;
705 yylloc.first_column = 13;
706 yylloc.last_column = 17;
721 AT_CHECK([[bison -o glr-regr8.c glr-regr8.y]], 0, [],
722 [glr-regr8.y: conflicts: 1 reduce/reduce
724 AT_COMPILE([glr-regr8])
726 AT_CHECK([[./glr-regr8]], 0,
735 ## ------------------------------------------------------------------------- ##
736 ## No users destructors if stack 0 deleted. See ##
737 ## <http://lists.gnu.org/archive/html/bison-patches/2005-09/msg00109.html>. ##
738 ## ------------------------------------------------------------------------- ##
740 AT_SETUP([No users destructors if stack 0 deleted])
742 AT_DATA_GRAMMAR([glr-regr9.y],
747 static void yyerror (char const *);
748 static int yylex (void);
749 # define YYSTACKEXPANDABLE 0
750 static int tokens = 0;
751 static int destructors = 0;
756 %union { int dummy; }
766 ambig0 'a' { destructors += 2; USE ($2); }
767 | ambig1 start { destructors += 1; }
768 | ambig2 start { destructors += 1; }
785 yyerror (char const *msg)
787 fprintf (stderr, "%s\n", msg);
794 exit_status = yyparse ();
795 if (tokens != destructors)
797 fprintf (stderr, "Tokens = %d, Destructors = %d\n", tokens, destructors);
804 AT_CHECK([[bison -o glr-regr9.c glr-regr9.y]], 0, [],
805 [glr-regr9.y: conflicts: 1 reduce/reduce
807 AT_COMPILE([glr-regr9])
809 AT_CHECK([[./glr-regr9]], 0, [],
816 ## ------------------------------------------------------------------------- ##
817 ## Corrupted semantic options if user action cuts parse. ##
818 ## ------------------------------------------------------------------------- ##
820 AT_SETUP([Corrupted semantic options if user action cuts parse])
822 AT_DATA_GRAMMAR([glr-regr10.y],
826 static void yyerror (char const *);
827 static int yylex (void);
828 #define GARBAGE_SIZE 50
829 static char garbage[GARBAGE_SIZE];
833 %union { char *ptr; }
839 %dprec 2 { $$ = garbage; YYACCEPT; }
840 | %dprec 1 { $$ = garbage; YYACCEPT; }
846 yyerror (char const *msg)
848 fprintf (stderr, "%s\n", msg);
861 for (i = 0; i < GARBAGE_SIZE; i+=1)
867 AT_CHECK([[bison -t -o glr-regr10.c glr-regr10.y]], 0, [],
868 [glr-regr10.y: conflicts: 1 reduce/reduce
870 AT_COMPILE([glr-regr10])
872 AT_CHECK([[./glr-regr10]], 0, [], [])
877 ## ------------------------------------------------------------------------- ##
878 ## Undesirable destructors if user action cuts parse. ##
879 ## ------------------------------------------------------------------------- ##
881 AT_SETUP([Undesirable destructors if user action cuts parse])
883 AT_DATA_GRAMMAR([glr-regr11.y],
887 static void yyerror (char const *);
888 static int yylex (void);
889 static int destructors = 0;
894 %union { int dummy; }
896 %destructor { destructors += 1; } 'a'
901 'a' %dprec 2 { USE ($1); destructors += 1; YYACCEPT; }
902 | 'a' %dprec 1 { USE ($1); destructors += 1; YYACCEPT; }
908 yyerror (char const *msg)
910 fprintf (stderr, "%s\n", msg);
916 static char const *input = "a";
923 int exit_status = yyparse ();
924 if (destructors != 1)
926 fprintf (stderr, "Destructor calls: %d\n", destructors);
933 AT_CHECK([[bison -t -o glr-regr11.c glr-regr11.y]], 0, [],
934 [glr-regr11.y: conflicts: 1 reduce/reduce
936 AT_COMPILE([glr-regr11])
938 AT_CHECK([[./glr-regr11]], 0, [], [])
943 ## ------------------------------------------------------------------------- ##
944 ## Leaked merged semantic value if user action cuts parse. ##
945 ## ------------------------------------------------------------------------- ##
947 AT_SETUP([Leaked merged semantic value if user action cuts parse])
949 AT_DATA_GRAMMAR([glr-regr12.y],
952 %union { int dummy; }
954 %destructor { has_value = 0; } start
958 static int merge (YYSTYPE, YYSTYPE);
959 static void yyerror (char const *);
960 static int yylex (void);
961 static int has_value = 0;
968 %merge<merge> { has_value = 1; USE ($$); }
969 | %merge<merge> { USE ($$); YYACCEPT; }
975 merge (YYSTYPE s1, YYSTYPE s2)
978 char dummy = s1.dummy + s2.dummy;
983 yyerror (char const *msg)
985 fprintf (stderr, "%s\n", msg);
997 int exit_status = yyparse ();
1000 fprintf (stderr, "Destructor not called.\n");
1007 AT_CHECK([[bison -t -o glr-regr12.c glr-regr12.y]], 0, [],
1008 [glr-regr12.y: conflicts: 1 reduce/reduce
1010 AT_COMPILE([glr-regr12])
1012 AT_CHECK([[./glr-regr12]], 0, [], [])
1017 ## ------------------------------------------------------------------------- ##
1018 ## Incorrect lookahead during deterministic GLR. See ##
1019 ## <http://lists.gnu.org/archive/html/help-bison/2005-07/msg00017.html> and ##
1020 ## <http://lists.gnu.org/archive/html/bison-patches/2006-01/msg00060.html>. ##
1021 ## ------------------------------------------------------------------------- ##
1023 AT_SETUP([Incorrect lookahead during deterministic GLR])
1025 AT_DATA_GRAMMAR([glr-regr13.y],
1028 - Defaulted state with initial yychar: yychar == YYEMPTY.
1029 - Nondefaulted state: yychar != YYEMPTY.
1030 - Defaulted state after lookahead: yychar != YYEMPTY.
1031 - Defaulted state after shift: yychar == YYEMPTY.
1032 - User action changing the lookahead. */
1036 static void yyerror (char const *);
1037 static int yylex (void);
1038 static void print_look_ahead (char const *);
1042 %union { char value; }
1043 %type <value> 'a' 'b'
1050 defstate_init defstate_shift 'b' change_lookahead 'a' {
1052 print_look_ahead ("start <- defstate_init defstate_shift 'b'");
1057 print_look_ahead ("defstate_init <- empty string");
1061 nondefstate defstate_look 'a' {
1063 print_look_ahead ("defstate_shift <- nondefstate defstate_look 'a'");
1068 print_look_ahead ("defstate_look <- empty string");
1073 print_look_ahead ("nondefstate <- empty string");
1077 print_look_ahead ("nondefstate <- 'b'");
1089 yyerror (char const *msg)
1091 fprintf (stderr, "%s\n", msg);
1097 static char const *input = "ab";
1099 yylloc.first_line = yylloc.last_line = 1;
1100 yylloc.first_column = yylloc.last_column = i + 1;
1101 yylval.value = input[i] + 'A' - 'a';
1106 print_look_ahead (char const *reduction)
1108 printf ("%s:\n yychar=", reduction);
1109 if (yychar == YYEMPTY)
1111 else if (yychar == YYEOF)
1115 printf ("'%c', yylval='", yychar);
1116 if (yylval.value > ' ')
1117 printf ("%c", yylval.value);
1118 printf ("', yylloc=(%d,%d),(%d,%d)",
1119 yylloc.first_line, yylloc.first_column,
1120 yylloc.last_line, yylloc.last_column);
1128 yychar = '#'; /* Not a token in the grammar. */
1134 AT_CHECK([[bison -t -o glr-regr13.c glr-regr13.y]], 0, [], [])
1135 AT_COMPILE([glr-regr13])
1137 AT_CHECK([[./glr-regr13]], 0,
1138 [defstate_init <- empty string:
1140 nondefstate <- empty string:
1141 yychar='a', yylval='A', yylloc=(1,1),(1,1)
1142 defstate_look <- empty string:
1143 yychar='a', yylval='A', yylloc=(1,1),(1,1)
1144 defstate_shift <- nondefstate defstate_look 'a':
1146 start <- defstate_init defstate_shift 'b':
1153 ## ------------------------------------------------------------------------- ##
1154 ## Incorrect lookahead during nondeterministic GLR. ##
1155 ## ------------------------------------------------------------------------- ##
1157 AT_SETUP([Incorrect lookahead during nondeterministic GLR])
1159 AT_DATA_GRAMMAR([glr-regr14.y],
1162 - Conflicting actions (split-off parse, which copies lookahead need,
1163 which is necessarily yytrue) and nonconflicting actions (non-split-off
1164 parse) for nondefaulted state: yychar != YYEMPTY.
1165 - Merged deferred actions (lookahead need and RHS from different stack
1166 than the target state) and nonmerged deferred actions (same stack).
1167 - Defaulted state after lookahead: yychar != YYEMPTY.
1168 - Defaulted state after shift: yychar == YYEMPTY.
1169 - yychar != YYEMPTY but lookahead need is yyfalse (a previous stack has
1170 seen the lookahead but current stack has not).
1171 - Exceeding stack capacity (stack explosion), and thus reallocating
1172 lookahead need array.
1173 Note that it does not seem possible to see the initial yychar value during
1174 nondeterministic operation since:
1175 - In order to preserve the initial yychar, only defaulted states may be
1177 - If only defaulted states are entered, there are no conflicts, so
1178 nondeterministic operation does not start. */
1180 %union { char value; }
1184 static void yyerror (char const *);
1185 static int yylex (void);
1186 static void print_look_ahead (char const *);
1187 static char merge (union YYSTYPE, union YYSTYPE);
1191 %type <value> 'a' 'b' 'c' 'd' stack_explosion
1198 merge 'c' stack_explosion {
1200 print_look_ahead ("start <- merge 'c' stack_explosion");
1204 /* When merging the 2 deferred actions, the lookahead needs are different. */
1206 nonconflict1 'a' 'b' nonconflict2 %dprec 1 {
1208 print_look_ahead ("merge <- nonconflict1 'a' 'b' nonconflict2");
1210 | conflict defstate_look 'a' nonconflict2 'b' defstate_shift %dprec 2 {
1212 print_look_ahead ("merge <- conflict defstate_look 'a' nonconflict2 'b'"
1219 print_look_ahead ("nonconflict1 <- empty string");
1224 print_look_ahead ("nonconflict2 <- empty string");
1228 print_look_ahead ("nonconflict2 <- 'a'");
1233 print_look_ahead ("conflict <- empty string");
1238 print_look_ahead ("defstate_look <- empty string");
1242 /* yychar != YYEMPTY but lookahead need is yyfalse. */
1245 print_look_ahead ("defstate_shift <- empty string");
1251 | alt1 stack_explosion %merge<merge> { $$ = $2; }
1252 | alt2 stack_explosion %merge<merge> { $$ = $2; }
1253 | alt3 stack_explosion %merge<merge> { $$ = $2; }
1258 if (yychar != 'd' && yychar != YYEOF)
1260 fprintf (stderr, "Incorrect lookahead during stack explosion.\n");
1267 if (yychar != 'd' && yychar != YYEOF)
1269 fprintf (stderr, "Incorrect lookahead during stack explosion.\n");
1276 if (yychar != 'd' && yychar != YYEOF)
1278 fprintf (stderr, "Incorrect lookahead during stack explosion.\n");
1284 if (yychar != YYEMPTY)
1287 "Found lookahead where shouldn't during stack explosion.\n");
1295 yyerror (char const *msg)
1297 fprintf (stderr, "%s\n", msg);
1303 static char const *input = "abcdddd";
1305 yylloc.first_line = yylloc.last_line = 1;
1306 yylloc.first_column = yylloc.last_column = i + 1;
1307 yylval.value = input[i] + 'A' - 'a';
1312 print_look_ahead (char const *reduction)
1314 printf ("%s:\n yychar=", reduction);
1315 if (yychar == YYEMPTY)
1317 else if (yychar == YYEOF)
1321 printf ("'%c', yylval='", yychar);
1322 if (yylval.value > ' ')
1323 printf ("%c", yylval.value);
1324 printf ("', yylloc=(%d,%d),(%d,%d)",
1325 yylloc.first_line, yylloc.first_column,
1326 yylloc.last_line, yylloc.last_column);
1332 merge (union YYSTYPE s1, union YYSTYPE s2)
1334 char dummy = s1.value + s2.value;
1341 yychar = '#'; /* Not a token in the grammar. */
1347 AT_CHECK([[bison -t -o glr-regr14.c glr-regr14.y]], 0, [],
1348 [glr-regr14.y: conflicts: 3 reduce/reduce
1350 AT_COMPILE([glr-regr14])
1352 AT_CHECK([[./glr-regr14]], 0,
1353 [conflict <- empty string:
1354 yychar='a', yylval='A', yylloc=(1,1),(1,1)
1355 defstate_look <- empty string:
1356 yychar='a', yylval='A', yylloc=(1,1),(1,1)
1357 nonconflict2 <- empty string:
1358 yychar='b', yylval='B', yylloc=(1,2),(1,2)
1359 defstate_shift <- empty string:
1361 merge <- conflict defstate_look 'a' nonconflict2 'b' defstate_shift:
1363 start <- merge 'c' stack_explosion: