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(const char *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); }
687 void yyerror(const char *msg)
689 fprintf (stderr, "error\n");
700 yylloc.first_column = 1;
701 yylloc.last_column = 9;
704 yylloc.first_column = 13;
705 yylloc.last_column = 17;
720 AT_CHECK([[bison -o glr-regr8.c glr-regr8.y]], 0, [],
721 [glr-regr8.y: conflicts: 1 reduce/reduce
723 AT_COMPILE([glr-regr8])
725 AT_CHECK([[./glr-regr8]], 0,
734 ## ------------------------------------------------------------------------- ##
735 ## No users destructors if stack 0 deleted. See ##
736 ## <http://lists.gnu.org/archive/html/bison-patches/2005-09/msg00109.html>. ##
737 ## ------------------------------------------------------------------------- ##
739 AT_SETUP([No users destructors if stack 0 deleted])
741 AT_DATA_GRAMMAR([glr-regr9.y],
746 static void yyerror (char const *);
747 static int yylex (void);
748 # define YYSTACKEXPANDABLE 0
749 static int tokens = 0;
750 static int destructors = 0;
755 %union { int dummy; }
765 ambig0 'a' { destructors += 2; USE ($2); }
766 | ambig1 start { destructors += 1; }
767 | ambig2 start { destructors += 1; }
784 yyerror (char const *msg)
786 fprintf (stderr, "%s\n", msg);
793 exit_status = yyparse ();
794 if (tokens != destructors)
796 fprintf (stderr, "Tokens = %d, Destructors = %d\n", tokens, destructors);
803 AT_CHECK([[bison -o glr-regr9.c glr-regr9.y]], 0, [],
804 [glr-regr9.y: conflicts: 1 reduce/reduce
806 AT_COMPILE([glr-regr9])
808 AT_CHECK([[./glr-regr9]], 0, [],
815 ## ------------------------------------------------------------------------- ##
816 ## Corrupted semantic options if user action cuts parse. ##
817 ## ------------------------------------------------------------------------- ##
819 AT_SETUP([Corrupted semantic options if user action cuts parse])
821 AT_DATA_GRAMMAR([glr-regr10.y],
825 static void yyerror (char const *);
826 static int yylex (void);
827 #define GARBAGE_SIZE 50
828 static char garbage[GARBAGE_SIZE];
832 %union { char *ptr; }
838 %dprec 2 { $$ = garbage; YYACCEPT; }
839 | %dprec 1 { $$ = garbage; YYACCEPT; }
845 yyerror (char const *msg)
847 fprintf (stderr, "%s\n", msg);
860 for (index = 0; index < GARBAGE_SIZE; index+=1)
861 garbage[index] = 108;
866 AT_CHECK([[bison -t -o glr-regr10.c glr-regr10.y]], 0, [],
867 [glr-regr10.y: conflicts: 1 reduce/reduce
869 AT_COMPILE([glr-regr10])
871 AT_CHECK([[./glr-regr10]], 0, [], [])
876 ## ------------------------------------------------------------------------- ##
877 ## Undesirable destructors if user action cuts parse. ##
878 ## ------------------------------------------------------------------------- ##
880 AT_SETUP([Undesirable destructors if user action cuts parse])
882 AT_DATA_GRAMMAR([glr-regr11.y],
886 static void yyerror (char const *);
887 static int yylex (void);
888 static int destructors = 0;
893 %union { int dummy; }
895 %destructor { destructors += 1; } 'a'
900 'a' %dprec 2 { USE ($1); destructors += 1; YYACCEPT; }
901 | 'a' %dprec 1 { USE ($1); destructors += 1; YYACCEPT; }
907 yyerror (char const *msg)
909 fprintf (stderr, "%s\n", msg);
915 static char const *input = "a";
922 int exit_status = yyparse ();
923 if (destructors != 1)
925 fprintf (stderr, "Destructor calls: %d\n", destructors);
932 AT_CHECK([[bison -t -o glr-regr11.c glr-regr11.y]], 0, [],
933 [glr-regr11.y: conflicts: 1 reduce/reduce
935 AT_COMPILE([glr-regr11])
937 AT_CHECK([[./glr-regr11]], 0, [], [])
942 ## ------------------------------------------------------------------------- ##
943 ## Leaked merged semantic value if user action cuts parse. ##
944 ## ------------------------------------------------------------------------- ##
946 AT_SETUP([Leaked merged semantic value if user action cuts parse])
948 AT_DATA_GRAMMAR([glr-regr12.y],
951 %union { int dummy; }
953 %destructor { has_value = 0; } start
957 static int merge (YYSTYPE, YYSTYPE);
958 static void yyerror (char const *);
959 static int yylex (void);
960 static int has_value = 0;
967 %merge<merge> { has_value = 1; USE ($$); }
968 | %merge<merge> { USE ($$); YYACCEPT; }
974 merge (YYSTYPE s1, YYSTYPE s2)
977 char dummy = s1.dummy + s2.dummy;
982 yyerror (char const *msg)
984 fprintf (stderr, "%s\n", msg);
996 int exit_status = yyparse ();
999 fprintf (stderr, "Destructor not called.\n");
1006 AT_CHECK([[bison -t -o glr-regr12.c glr-regr12.y]], 0, [],
1007 [glr-regr12.y: conflicts: 1 reduce/reduce
1009 AT_COMPILE([glr-regr12])
1011 AT_CHECK([[./glr-regr12]], 0, [], [])
1016 ## ------------------------------------------------------------------------- ##
1017 ## Incorrect lookahead during deterministic GLR. See ##
1018 ## <http://lists.gnu.org/archive/html/help-bison/2005-07/msg00017.html>. ##
1019 ## ------------------------------------------------------------------------- ##
1021 AT_SETUP([Incorrect lookahead during deterministic GLR])
1023 AT_DATA_GRAMMAR([glr-regr13.y],
1026 - Defaulted state with initial yychar: yychar == YYEMPTY.
1027 - Nondefaulted state: yychar != YYEMPTY.
1028 - Defaulted state after lookahead: yychar != YYEMPTY.
1029 - Defaulted state after shift: yychar == YYEMPTY. */
1033 static void yyerror (char const *);
1034 static int yylex (void);
1035 static void print_look_ahead (char const *);
1039 %union { char value; }
1040 %type <value> 'a' 'b'
1047 defstate_init defstate_shift 'b' {
1049 print_look_ahead ("start <- defstate_init defstate_shift 'b'");
1054 print_look_ahead ("defstate_init <- empty string");
1058 nondefstate defstate_look 'a' {
1060 print_look_ahead ("defstate_shift <- nondefstate defstate_look 'a'");
1065 print_look_ahead ("defstate_look <- empty string");
1070 print_look_ahead ("nondefstate <- empty string");
1074 print_look_ahead ("nondefstate <- 'b'");
1081 yyerror (char const *msg)
1083 fprintf (stderr, "%s\n", msg);
1089 static char const *input = "ab";
1090 static int index = 0;
1091 yylloc.first_line = yylloc.last_line = 1;
1092 yylloc.first_column = yylloc.last_column = index+1;
1093 yylval.value = input[index] + 'A' - 'a';
1094 return input[index++];
1098 print_look_ahead (char const *reduction)
1100 printf ("%s:\n yychar=", reduction);
1101 if (yychar == YYEMPTY)
1103 else if (yychar == YYEOF)
1107 printf ("'%c', yylval='", yychar);
1108 if (yylval.value > ' ')
1109 printf ("%c", yylval.value);
1110 printf ("', yylloc=(%d,%d),(%d,%d)",
1111 yylloc.first_line, yylloc.first_column,
1112 yylloc.last_line, yylloc.last_column);
1120 yychar = '#'; /* Not a token in the grammar. */
1126 AT_CHECK([[bison -t -o glr-regr13.c glr-regr13.y]], 0, [], [])
1127 AT_COMPILE([glr-regr13])
1129 AT_CHECK([[./glr-regr13]], 0,
1130 [defstate_init <- empty string:
1132 nondefstate <- empty string:
1133 yychar='a', yylval='A', yylloc=(1,1),(1,1)
1134 defstate_look <- empty string:
1135 yychar='a', yylval='A', yylloc=(1,1),(1,1)
1136 defstate_shift <- nondefstate defstate_look 'a':
1138 start <- defstate_init defstate_shift 'b':
1145 ## ------------------------------------------------------------------------- ##
1146 ## Incorrect lookahead during nondeterministic GLR. ##
1147 ## ------------------------------------------------------------------------- ##
1149 AT_SETUP([Incorrect lookahead during nondeterministic GLR])
1151 AT_DATA_GRAMMAR([glr-regr14.y],
1154 - Conflicting actions (split-off parse, which copies lookahead need,
1155 which is necessarily yytrue) and nonconflicting actions (non-split-off
1156 parse) for nondefaulted state: yychar != YYEMPTY.
1157 - Merged deferred actions (lookahead need and RHS from different stack
1158 than the target state) and nonmerged deferred actions (same stack).
1159 - Defaulted state after lookahead: yychar != YYEMPTY.
1160 - Defaulted state after shift: yychar == YYEMPTY.
1161 - yychar != YYEMPTY but lookahead need is yyfalse (a previous stack has
1162 seen the lookahead but current stack has not).
1163 - Exceeding stack capacity (stack explosion), and thus reallocating
1164 lookahead need array.
1165 Note that it does not seem possible to see the initial yychar value during
1166 nondeterministic operation since:
1167 - In order to preserve the initial yychar, only defaulted states may be
1169 - If only defaulted states are entered, there are no conflicts, so
1170 nondeterministic operation does not start. */
1172 %union { char value; }
1176 static void yyerror (char const *);
1177 static int yylex (void);
1178 static void print_look_ahead (char const *);
1179 static char merge (union YYSTYPE, union YYSTYPE);
1183 %type <value> 'a' 'b' 'c' 'd' stack_explosion
1190 merge 'c' stack_explosion {
1192 print_look_ahead ("start <- merge 'c' stack_explosion");
1196 /* When merging the 2 deferred actions, the lookahead needs are different. */
1198 nonconflict1 'a' 'b' nonconflict2 %dprec 1 {
1200 print_look_ahead ("merge <- nonconflict1 'a' 'b' nonconflict2");
1202 | conflict defstate_look 'a' nonconflict2 'b' defstate_shift %dprec 2 {
1204 print_look_ahead ("merge <- conflict defstate_look 'a' nonconflict2 'b'"
1211 print_look_ahead ("nonconflict1 <- empty string");
1216 print_look_ahead ("nonconflict2 <- empty string");
1220 print_look_ahead ("nonconflict2 <- 'a'");
1225 print_look_ahead ("conflict <- empty string");
1230 print_look_ahead ("defstate_look <- empty string");
1234 /* yychar != YYEMPTY but lookahead need is yyfalse. */
1237 print_look_ahead ("defstate_shift <- empty string");
1243 | alt1 stack_explosion %merge<merge> { $$ = $2; }
1244 | alt2 stack_explosion %merge<merge> { $$ = $2; }
1245 | alt3 stack_explosion %merge<merge> { $$ = $2; }
1250 if (yychar != 'd' && yychar != YYEOF)
1252 fprintf (stderr, "Incorrect lookahead during stack explosion.\n");
1259 if (yychar != 'd' && yychar != YYEOF)
1261 fprintf (stderr, "Incorrect lookahead during stack explosion.\n");
1268 if (yychar != 'd' && yychar != YYEOF)
1270 fprintf (stderr, "Incorrect lookahead during stack explosion.\n");
1276 if (yychar != YYEMPTY)
1279 "Found lookahead where shouldn't during stack explosion.\n");
1287 yyerror (char const *msg)
1289 fprintf (stderr, "%s\n", msg);
1295 static char const *input = "abcdddd";
1296 static int index = 0;
1297 yylloc.first_line = yylloc.last_line = 1;
1298 yylloc.first_column = yylloc.last_column = index+1;
1299 yylval.value = input[index] + 'A' - 'a';
1300 return input[index++];
1304 print_look_ahead (char const *reduction)
1306 printf ("%s:\n yychar=", reduction);
1307 if (yychar == YYEMPTY)
1309 else if (yychar == YYEOF)
1313 printf ("'%c', yylval='", yychar);
1314 if (yylval.value > ' ')
1315 printf ("%c", yylval.value);
1316 printf ("', yylloc=(%d,%d),(%d,%d)",
1317 yylloc.first_line, yylloc.first_column,
1318 yylloc.last_line, yylloc.last_column);
1324 merge (union YYSTYPE s1, union YYSTYPE s2)
1326 char dummy = s1.value + s2.value;
1333 yychar = '#'; /* Not a token in the grammar. */
1339 AT_CHECK([[bison -t -o glr-regr14.c glr-regr14.y]], 0, [],
1340 [glr-regr14.y: conflicts: 3 reduce/reduce
1342 AT_COMPILE([glr-regr14])
1344 AT_CHECK([[./glr-regr14]], 0,
1345 [conflict <- empty string:
1346 yychar='a', yylval='A', yylloc=(1,1),(1,1)
1347 defstate_look <- empty string:
1348 yychar='a', yylval='A', yylloc=(1,1),(1,1)
1349 nonconflict2 <- empty string:
1350 yychar='b', yylval='B', yylloc=(1,2),(1,2)
1351 defstate_shift <- empty string:
1353 merge <- conflict defstate_look 'a' nonconflict2 'b' defstate_shift:
1355 start <- merge 'c' stack_explosion: