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>. ##
1020 ## ------------------------------------------------------------------------- ##
1022 AT_SETUP([Incorrect lookahead during deterministic GLR])
1024 AT_DATA_GRAMMAR([glr-regr13.y],
1027 - Defaulted state with initial yychar: yychar == YYEMPTY.
1028 - Nondefaulted state: yychar != YYEMPTY.
1029 - Defaulted state after lookahead: yychar != YYEMPTY.
1030 - Defaulted state after shift: yychar == YYEMPTY. */
1034 static void yyerror (char const *);
1035 static int yylex (void);
1036 static void print_look_ahead (char const *);
1040 %union { char value; }
1041 %type <value> 'a' 'b'
1048 defstate_init defstate_shift 'b' {
1050 print_look_ahead ("start <- defstate_init defstate_shift 'b'");
1055 print_look_ahead ("defstate_init <- empty string");
1059 nondefstate defstate_look 'a' {
1061 print_look_ahead ("defstate_shift <- nondefstate defstate_look 'a'");
1066 print_look_ahead ("defstate_look <- empty string");
1071 print_look_ahead ("nondefstate <- empty string");
1075 print_look_ahead ("nondefstate <- 'b'");
1082 yyerror (char const *msg)
1084 fprintf (stderr, "%s\n", msg);
1090 static char const *input = "ab";
1092 yylloc.first_line = yylloc.last_line = 1;
1093 yylloc.first_column = yylloc.last_column = i + 1;
1094 yylval.value = input[i] + 'A' - 'a';
1099 print_look_ahead (char const *reduction)
1101 printf ("%s:\n yychar=", reduction);
1102 if (yychar == YYEMPTY)
1104 else if (yychar == YYEOF)
1108 printf ("'%c', yylval='", yychar);
1109 if (yylval.value > ' ')
1110 printf ("%c", yylval.value);
1111 printf ("', yylloc=(%d,%d),(%d,%d)",
1112 yylloc.first_line, yylloc.first_column,
1113 yylloc.last_line, yylloc.last_column);
1121 yychar = '#'; /* Not a token in the grammar. */
1127 AT_CHECK([[bison -t -o glr-regr13.c glr-regr13.y]], 0, [], [])
1128 AT_COMPILE([glr-regr13])
1130 AT_CHECK([[./glr-regr13]], 0,
1131 [defstate_init <- empty string:
1133 nondefstate <- empty string:
1134 yychar='a', yylval='A', yylloc=(1,1),(1,1)
1135 defstate_look <- empty string:
1136 yychar='a', yylval='A', yylloc=(1,1),(1,1)
1137 defstate_shift <- nondefstate defstate_look 'a':
1139 start <- defstate_init defstate_shift 'b':
1146 ## ------------------------------------------------------------------------- ##
1147 ## Incorrect lookahead during nondeterministic GLR. ##
1148 ## ------------------------------------------------------------------------- ##
1150 AT_SETUP([Incorrect lookahead during nondeterministic GLR])
1152 AT_DATA_GRAMMAR([glr-regr14.y],
1155 - Conflicting actions (split-off parse, which copies lookahead need,
1156 which is necessarily yytrue) and nonconflicting actions (non-split-off
1157 parse) for nondefaulted state: yychar != YYEMPTY.
1158 - Merged deferred actions (lookahead need and RHS from different stack
1159 than the target state) and nonmerged deferred actions (same stack).
1160 - Defaulted state after lookahead: yychar != YYEMPTY.
1161 - Defaulted state after shift: yychar == YYEMPTY.
1162 - yychar != YYEMPTY but lookahead need is yyfalse (a previous stack has
1163 seen the lookahead but current stack has not).
1164 - Exceeding stack capacity (stack explosion), and thus reallocating
1165 lookahead need array.
1166 Note that it does not seem possible to see the initial yychar value during
1167 nondeterministic operation since:
1168 - In order to preserve the initial yychar, only defaulted states may be
1170 - If only defaulted states are entered, there are no conflicts, so
1171 nondeterministic operation does not start. */
1173 %union { char value; }
1177 static void yyerror (char const *);
1178 static int yylex (void);
1179 static void print_look_ahead (char const *);
1180 static char merge (union YYSTYPE, union YYSTYPE);
1184 %type <value> 'a' 'b' 'c' 'd' stack_explosion
1191 merge 'c' stack_explosion {
1193 print_look_ahead ("start <- merge 'c' stack_explosion");
1197 /* When merging the 2 deferred actions, the lookahead needs are different. */
1199 nonconflict1 'a' 'b' nonconflict2 %dprec 1 {
1201 print_look_ahead ("merge <- nonconflict1 'a' 'b' nonconflict2");
1203 | conflict defstate_look 'a' nonconflict2 'b' defstate_shift %dprec 2 {
1205 print_look_ahead ("merge <- conflict defstate_look 'a' nonconflict2 'b'"
1212 print_look_ahead ("nonconflict1 <- empty string");
1217 print_look_ahead ("nonconflict2 <- empty string");
1221 print_look_ahead ("nonconflict2 <- 'a'");
1226 print_look_ahead ("conflict <- empty string");
1231 print_look_ahead ("defstate_look <- empty string");
1235 /* yychar != YYEMPTY but lookahead need is yyfalse. */
1238 print_look_ahead ("defstate_shift <- empty string");
1244 | alt1 stack_explosion %merge<merge> { $$ = $2; }
1245 | alt2 stack_explosion %merge<merge> { $$ = $2; }
1246 | alt3 stack_explosion %merge<merge> { $$ = $2; }
1251 if (yychar != 'd' && yychar != YYEOF)
1253 fprintf (stderr, "Incorrect lookahead during stack explosion.\n");
1260 if (yychar != 'd' && yychar != YYEOF)
1262 fprintf (stderr, "Incorrect lookahead during stack explosion.\n");
1269 if (yychar != 'd' && yychar != YYEOF)
1271 fprintf (stderr, "Incorrect lookahead during stack explosion.\n");
1277 if (yychar != YYEMPTY)
1280 "Found lookahead where shouldn't during stack explosion.\n");
1288 yyerror (char const *msg)
1290 fprintf (stderr, "%s\n", msg);
1296 static char const *input = "abcdddd";
1298 yylloc.first_line = yylloc.last_line = 1;
1299 yylloc.first_column = yylloc.last_column = i + 1;
1300 yylval.value = input[i] + 'A' - 'a';
1305 print_look_ahead (char const *reduction)
1307 printf ("%s:\n yychar=", reduction);
1308 if (yychar == YYEMPTY)
1310 else if (yychar == YYEOF)
1314 printf ("'%c', yylval='", yychar);
1315 if (yylval.value > ' ')
1316 printf ("%c", yylval.value);
1317 printf ("', yylloc=(%d,%d),(%d,%d)",
1318 yylloc.first_line, yylloc.first_column,
1319 yylloc.last_line, yylloc.last_column);
1325 merge (union YYSTYPE s1, union YYSTYPE s2)
1327 char dummy = s1.value + s2.value;
1334 yychar = '#'; /* Not a token in the grammar. */
1340 AT_CHECK([[bison -t -o glr-regr14.c glr-regr14.y]], 0, [],
1341 [glr-regr14.y: conflicts: 3 reduce/reduce
1343 AT_COMPILE([glr-regr14])
1345 AT_CHECK([[./glr-regr14]], 0,
1346 [conflict <- empty string:
1347 yychar='a', yylval='A', yylloc=(1,1),(1,1)
1348 defstate_look <- empty string:
1349 yychar='a', yylval='A', yylloc=(1,1),(1,1)
1350 nonconflict2 <- empty string:
1351 yychar='b', yylval='B', yylloc=(1,2),(1,2)
1352 defstate_shift <- empty string:
1354 merge <- conflict defstate_look 'a' nonconflict2 'b' defstate_shift:
1356 start <- merge 'c' stack_explosion: