]> git.saurik.com Git - bison.git/blame - tests/reduce.at
tables: scope reduction
[bison.git] / tests / reduce.at
CommitLineData
cb4956ee 1# Exercising Bison Grammar Reduction. -*- Autotest -*-
7d424de1 2
34136e65 3# Copyright (C) 2001-2002, 2007-2012 Free Software Foundation, Inc.
cb4956ee 4
f16b0819 5# This program is free software: you can redistribute it and/or modify
cb4956ee 6# it under the terms of the GNU General Public License as published by
f16b0819
PE
7# the Free Software Foundation, either version 3 of the License, or
8# (at your option) any later version.
9#
cb4956ee
AD
10# This program is distributed in the hope that it will be useful,
11# but WITHOUT ANY WARRANTY; without even the implied warranty of
12# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13# GNU General Public License for more details.
f16b0819 14#
cb4956ee 15# You should have received a copy of the GNU General Public License
f16b0819 16# along with this program. If not, see <http://www.gnu.org/licenses/>.
cb4956ee
AD
17
18AT_BANNER([[Grammar Reduction.]])
19
20
21## ------------------- ##
22## Useless Terminals. ##
23## ------------------- ##
24
25AT_SETUP([Useless Terminals])
26
27AT_DATA([[input.y]],
28[[%verbose
02975b9a 29%output "input.c"
cb4956ee
AD
30
31%token useless1
32%token useless2
33%token useless3
34%token useless4
35%token useless5
36%token useless6
37%token useless7
38%token useless8
39%token useless9
40
41%token useful
42%%
43exp: useful;
44]])
45
da730230 46AT_BISON_CHECK([[input.y]])
cb4956ee
AD
47
48AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' input.output]], 0,
d80fb37a 49[[Terminals unused in grammar
cb4956ee
AD
50 useless1
51 useless2
52 useless3
53 useless4
54 useless5
55 useless6
56 useless7
57 useless8
58 useless9
59]])
60
61AT_CLEANUP
62
63
64
65## ---------------------- ##
66## Useless Nonterminals. ##
67## ---------------------- ##
68
69AT_SETUP([Useless Nonterminals])
70
71AT_DATA([[input.y]],
72[[%verbose
02975b9a 73%output "input.c"
cb4956ee
AD
74
75%nterm useless1
76%nterm useless2
77%nterm useless3
78%nterm useless4
79%nterm useless5
80%nterm useless6
81%nterm useless7
82%nterm useless8
83%nterm useless9
84
85%token useful
86%%
87exp: useful;
88]])
89
da730230 90AT_BISON_CHECK([[input.y]], 0, [],
73370a9d
VS
91[[input.y: warning: 9 nonterminals useless in grammar [-Wother]
92input.y:4.8-15: warning: nonterminal useless in grammar: useless1 [-Wother]
93input.y:5.8-15: warning: nonterminal useless in grammar: useless2 [-Wother]
94input.y:6.8-15: warning: nonterminal useless in grammar: useless3 [-Wother]
95input.y:7.8-15: warning: nonterminal useless in grammar: useless4 [-Wother]
96input.y:8.8-15: warning: nonterminal useless in grammar: useless5 [-Wother]
97input.y:9.8-15: warning: nonterminal useless in grammar: useless6 [-Wother]
98input.y:10.8-15: warning: nonterminal useless in grammar: useless7 [-Wother]
99input.y:11.8-15: warning: nonterminal useless in grammar: useless8 [-Wother]
100input.y:12.8-15: warning: nonterminal useless in grammar: useless9 [-Wother]
760b53a8 101]])
cb4956ee
AD
102
103AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' input.output]], 0,
cff03fb2 104[[Nonterminals useless in grammar
cb4956ee
AD
105 useless1
106 useless2
107 useless3
108 useless4
109 useless5
110 useless6
111 useless7
112 useless8
113 useless9
114]])
115
116AT_CLEANUP
68f1e3ed
AD
117
118
119
120## --------------- ##
121## Useless Rules. ##
122## --------------- ##
123
124AT_SETUP([Useless Rules])
125
9757c359
AD
126AT_KEYWORDS([report])
127
68f1e3ed
AD
128AT_DATA([[input.y]],
129[[%verbose
02975b9a 130%output "input.c"
68f1e3ed
AD
131%token useful
132%%
133exp: useful;
134useless1: '1';
135useless2: '2';
136useless3: '3';
137useless4: '4';
138useless5: '5';
139useless6: '6';
140useless7: '7';
141useless8: '8';
142useless9: '9';
143]])
144
505ece51 145AT_BISON_CHECK([[-fcaret input.y]], 0, [],
f3ead217
TR
146[[input.y: warning: 9 nonterminals useless in grammar [-Wother]
147input.y: warning: 9 rules useless in grammar [-Wother]
148input.y:6.1-8: warning: nonterminal useless in grammar: useless1 [-Wother]
505ece51
TR
149 useless1: '1';
150 ^^^^^^^^
f3ead217 151input.y:7.1-8: warning: nonterminal useless in grammar: useless2 [-Wother]
505ece51
TR
152 useless2: '2';
153 ^^^^^^^^
f3ead217 154input.y:8.1-8: warning: nonterminal useless in grammar: useless3 [-Wother]
505ece51
TR
155 useless3: '3';
156 ^^^^^^^^
f3ead217 157input.y:9.1-8: warning: nonterminal useless in grammar: useless4 [-Wother]
505ece51
TR
158 useless4: '4';
159 ^^^^^^^^
f3ead217 160input.y:10.1-8: warning: nonterminal useless in grammar: useless5 [-Wother]
505ece51
TR
161 useless5: '5';
162 ^^^^^^^^
f3ead217 163input.y:11.1-8: warning: nonterminal useless in grammar: useless6 [-Wother]
505ece51
TR
164 useless6: '6';
165 ^^^^^^^^
f3ead217 166input.y:12.1-8: warning: nonterminal useless in grammar: useless7 [-Wother]
505ece51
TR
167 useless7: '7';
168 ^^^^^^^^
f3ead217 169input.y:13.1-8: warning: nonterminal useless in grammar: useless8 [-Wother]
505ece51
TR
170 useless8: '8';
171 ^^^^^^^^
f3ead217 172input.y:14.1-8: warning: nonterminal useless in grammar: useless9 [-Wother]
505ece51
TR
173 useless9: '9';
174 ^^^^^^^^
f3ead217 175input.y:6.11-13: warning: rule useless in grammar [-Wother]
505ece51
TR
176 useless1: '1';
177 ^^^
f3ead217 178input.y:7.11-13: warning: rule useless in grammar [-Wother]
505ece51
TR
179 useless2: '2';
180 ^^^
f3ead217 181input.y:8.11-13: warning: rule useless in grammar [-Wother]
505ece51
TR
182 useless3: '3';
183 ^^^
f3ead217 184input.y:9.11-13: warning: rule useless in grammar [-Wother]
505ece51
TR
185 useless4: '4';
186 ^^^
f3ead217 187input.y:10.11-13: warning: rule useless in grammar [-Wother]
505ece51
TR
188 useless5: '5';
189 ^^^
f3ead217 190input.y:11.11-13: warning: rule useless in grammar [-Wother]
505ece51
TR
191 useless6: '6';
192 ^^^
f3ead217 193input.y:12.11-13: warning: rule useless in grammar [-Wother]
505ece51
TR
194 useless7: '7';
195 ^^^
f3ead217 196input.y:13.11-13: warning: rule useless in grammar [-Wother]
505ece51
TR
197 useless8: '8';
198 ^^^
f3ead217 199input.y:14.11-13: warning: rule useless in grammar [-Wother]
505ece51
TR
200 useless9: '9';
201 ^^^
202]])
203
da730230 204AT_BISON_CHECK([[input.y]], 0, [],
73370a9d
VS
205[[input.y: warning: 9 nonterminals useless in grammar [-Wother]
206input.y: warning: 9 rules useless in grammar [-Wother]
207input.y:6.1-8: warning: nonterminal useless in grammar: useless1 [-Wother]
208input.y:7.1-8: warning: nonterminal useless in grammar: useless2 [-Wother]
209input.y:8.1-8: warning: nonterminal useless in grammar: useless3 [-Wother]
210input.y:9.1-8: warning: nonterminal useless in grammar: useless4 [-Wother]
211input.y:10.1-8: warning: nonterminal useless in grammar: useless5 [-Wother]
212input.y:11.1-8: warning: nonterminal useless in grammar: useless6 [-Wother]
213input.y:12.1-8: warning: nonterminal useless in grammar: useless7 [-Wother]
214input.y:13.1-8: warning: nonterminal useless in grammar: useless8 [-Wother]
215input.y:14.1-8: warning: nonterminal useless in grammar: useless9 [-Wother]
216input.y:6.11-13: warning: rule useless in grammar: useless1: '1' [-Wother]
217input.y:7.11-13: warning: rule useless in grammar: useless2: '2' [-Wother]
218input.y:8.11-13: warning: rule useless in grammar: useless3: '3' [-Wother]
219input.y:9.11-13: warning: rule useless in grammar: useless4: '4' [-Wother]
220input.y:10.11-13: warning: rule useless in grammar: useless5: '5' [-Wother]
221input.y:11.11-13: warning: rule useless in grammar: useless6: '6' [-Wother]
222input.y:12.11-13: warning: rule useless in grammar: useless7: '7' [-Wother]
223input.y:13.11-13: warning: rule useless in grammar: useless8: '8' [-Wother]
224input.y:14.11-13: warning: rule useless in grammar: useless9: '9' [-Wother]
68f1e3ed
AD
225]])
226
227AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' input.output]], 0,
cff03fb2 228[[Nonterminals useless in grammar
68f1e3ed
AD
229 useless1
230 useless2
231 useless3
232 useless4
233 useless5
234 useless6
235 useless7
236 useless8
237 useless9
d80fb37a 238Terminals unused in grammar
68f1e3ed
AD
239 '1'
240 '2'
241 '3'
242 '4'
243 '5'
244 '6'
245 '7'
246 '8'
247 '9'
cff03fb2 248Rules useless in grammar
9757c359
AD
249 2 useless1: '1'
250 3 useless2: '2'
251 4 useless3: '3'
252 5 useless4: '4'
253 6 useless5: '5'
254 7 useless6: '6'
255 8 useless7: '7'
256 9 useless8: '8'
257 10 useless9: '9'
68f1e3ed
AD
258]])
259
260AT_CLEANUP
261
262
263
c3b407f4
AD
264## ------------------- ##
265## Reduced Automaton. ##
266## ------------------- ##
267
268# Check that the automaton is that as the for the grammar reduced by
269# hand.
270
271AT_SETUP([Reduced Automaton])
272
9757c359
AD
273AT_KEYWORDS([report])
274
c3b407f4
AD
275# The non reduced grammar.
276# ------------------------
277AT_DATA([[not-reduced.y]],
278[[/* A useless token. */
279%token useless_token
280/* A useful one. */
281%token useful
282%verbose
02975b9a 283%output "not-reduced.c"
c3b407f4
AD
284
285%%
286
287exp: useful { /* A useful action. */ }
288 | non_productive { /* A non productive action. */ }
289 ;
290
291not_reachable: useful { /* A not reachable action. */ }
292 ;
293
294non_productive: non_productive useless_token
295 { /* Another non productive action. */ }
296 ;
e9955c83 297%%
c3b407f4
AD
298]])
299
505ece51 300AT_BISON_CHECK([[-fcaret not-reduced.y]], 0, [],
f3ead217
TR
301[[not-reduced.y: warning: 2 nonterminals useless in grammar [-Wother]
302not-reduced.y: warning: 3 rules useless in grammar [-Wother]
303not-reduced.y:14.1-13: warning: nonterminal useless in grammar: not_reachable [-Wother]
505ece51
TR
304 not_reachable: useful { /* A not reachable action. */ }
305 ^^^^^^^^^^^^^
f3ead217 306not-reduced.y:11.6-19: warning: nonterminal useless in grammar: non_productive [-Wother]
505ece51
TR
307 | non_productive { /* A non productive action. */ }
308 ^^^^^^^^^^^^^^
f3ead217 309not-reduced.y:11.6-57: warning: rule useless in grammar [-Wother]
505ece51
TR
310 | non_productive { /* A non productive action. */ }
311 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
f3ead217 312not-reduced.y:14.16-56: warning: rule useless in grammar [-Wother]
505ece51
TR
313 not_reachable: useful { /* A not reachable action. */ }
314 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
f3ead217 315not-reduced.y:17.17-18.63: warning: rule useless in grammar [-Wother]
505ece51
TR
316 non_productive: non_productive useless_token
317 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
318]])
319
da730230 320AT_BISON_CHECK([[not-reduced.y]], 0, [],
73370a9d
VS
321[[not-reduced.y: warning: 2 nonterminals useless in grammar [-Wother]
322not-reduced.y: warning: 3 rules useless in grammar [-Wother]
323not-reduced.y:14.1-13: warning: nonterminal useless in grammar: not_reachable [-Wother]
324not-reduced.y:11.6-19: warning: nonterminal useless in grammar: non_productive [-Wother]
325not-reduced.y:11.6-57: warning: rule useless in grammar: exp: non_productive [-Wother]
326not-reduced.y:14.16-56: warning: rule useless in grammar: not_reachable: useful [-Wother]
327not-reduced.y:17.17-18.63: warning: rule useless in grammar: non_productive: non_productive useless_token [-Wother]
c3b407f4
AD
328]])
329
330AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' not-reduced.output]], 0,
cff03fb2 331[[Nonterminals useless in grammar
c3b407f4
AD
332 not_reachable
333 non_productive
d80fb37a 334Terminals unused in grammar
c3b407f4 335 useless_token
cff03fb2 336Rules useless in grammar
9757c359
AD
337 2 exp: non_productive
338 3 not_reachable: useful
339 4 non_productive: non_productive useless_token
c3b407f4
AD
340]])
341
342# The reduced grammar.
343# --------------------
344AT_DATA([[reduced.y]],
345[[/* A useless token. */
346%token useless_token
347/* A useful one. */
348%token useful
349%verbose
02975b9a 350%output "reduced.c"
c3b407f4
AD
351
352%%
353
354exp: useful { /* A useful action. */ }
355// | non_productive { /* A non productive action. */ } */
356 ;
357
358//not_reachable: useful { /* A not reachable action. */ }
359// ;
360
361//non_productive: non_productive useless_token
362// { /* Another non productive action. */ }
363// ;
e9955c83 364%%
c3b407f4
AD
365]])
366
da730230 367AT_BISON_CHECK([[reduced.y]])
c3b407f4
AD
368
369# Comparing the parsers.
370cp reduced.c expout
371AT_CHECK([sed 's/not-reduced/reduced/g' not-reduced.c], 0, [expout])
372
373AT_CLEANUP
374
375
376
68f1e3ed
AD
377## ------------------- ##
378## Underivable Rules. ##
379## ------------------- ##
380
381AT_SETUP([Underivable Rules])
382
9757c359
AD
383AT_KEYWORDS([report])
384
68f1e3ed
AD
385AT_DATA([[input.y]],
386[[%verbose
02975b9a 387%output "input.c"
68f1e3ed
AD
388%token useful
389%%
390exp: useful | underivable;
391underivable: indirection;
392indirection: underivable;
393]])
394
da730230 395AT_BISON_CHECK([[input.y]], 0, [],
73370a9d
VS
396[[input.y: warning: 2 nonterminals useless in grammar [-Wother]
397input.y: warning: 3 rules useless in grammar [-Wother]
398input.y:5.15-25: warning: nonterminal useless in grammar: underivable [-Wother]
399input.y:6.14-24: warning: nonterminal useless in grammar: indirection [-Wother]
400input.y:5.15-25: warning: rule useless in grammar: exp: underivable [-Wother]
401input.y:6.14-24: warning: rule useless in grammar: underivable: indirection [-Wother]
402input.y:7.14-24: warning: rule useless in grammar: indirection: underivable [-Wother]
68f1e3ed
AD
403]])
404
405AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' input.output]], 0,
cff03fb2 406[[Nonterminals useless in grammar
68f1e3ed
AD
407 underivable
408 indirection
cff03fb2 409Rules useless in grammar
9757c359
AD
410 2 exp: underivable
411 3 underivable: indirection
412 4 indirection: underivable
68f1e3ed
AD
413]])
414
415AT_CLEANUP
1bfb97db
AD
416
417
418
419## ---------------- ##
420## Empty Language. ##
421## ---------------- ##
422
423AT_SETUP([Empty Language])
424
425AT_DATA([[input.y]],
02975b9a 426[[%output "input.c"
1bfb97db
AD
427%%
428exp: exp;
429]])
430
da730230 431AT_BISON_CHECK([[input.y]], 1, [],
73370a9d
VS
432[[input.y: warning: 2 nonterminals useless in grammar [-Wother]
433input.y: warning: 2 rules useless in grammar [-Wother]
1bfb97db
AD
434input.y:3.1-3: fatal error: start symbol exp does not derive any sentence
435]])
436
437AT_CLEANUP
7254f6a8
JD
438
439
440
db34f798
JD
441## ----------------- ##
442## %define lr.type. ##
443## ----------------- ##
444
445# AT_TEST_LR_TYPE(DESCRIPTION,
446# DECLS, GRAMMAR, INPUT,
447# BISON-STDERR, TABLES,
448# [OTHER-CHECKS],
449# [PARSER-EXIT-VALUE],
450# [PARSER-STDOUT], [PARSER-STDERR])
451# -------------------------------------------------
452m4_define([AT_TEST_LR_TYPE],
453[
454AT_TEST_TABLES_AND_PARSE([[no %define lr.type: ]$1],
455 [[LALR]], [[]],
456 [$2], m4_shiftn(2, $@))
cf499cff 457AT_TEST_TABLES_AND_PARSE([[%define lr.type lalr: ]$1],
db34f798 458 [[LALR]], [[]],
cf499cff 459 [[%define lr.type lalr
db34f798
JD
460]$2],
461 m4_shiftn(2, $@))
cf499cff 462AT_TEST_TABLES_AND_PARSE([[%define lr.type ielr: ]$1],
db34f798 463 [[IELR]], [[]],
cf499cff 464 [[%define lr.type ielr
db34f798
JD
465]$2],
466 m4_shiftn(2, $@))
cf499cff 467AT_TEST_TABLES_AND_PARSE([[%define lr.type canonical-lr: ]$1],
db34f798 468 [[canonical LR]], [[]],
cf499cff 469 [[%define lr.type canonical-lr
db34f798
JD
470]$2],
471 m4_shiftn(2, $@))
472])
473
474AT_TEST_LR_TYPE([[Single State Split]],
475[[%left 'a'
476// Conflict resolution renders state 12 unreachable for canonical LR(1). We
477// keep it so that the paser table diff is easier to code.
f3bc3386 478%define lr.keep-unreachable-state]],
db34f798
JD
479[[
480S: 'a' A 'a' /* rule 1 */
481 | 'b' A 'b' /* rule 2 */
482 | 'c' c /* rule 3 */
483 ;
484
485/* A conflict should appear after the first 'a' in rules 4 and 5 but only after
486 having shifted the first 'a' in rule 1. However, when LALR(1) merging is
487 chosen, the state containing that conflict is reused after having seen the
488 first 'b' in rule 2 and then the first 'a' in rules 4 and 5. In both cases,
489 because of the merged state, if the next token is an 'a', the %left forces a
490 reduction action with rule 5. In the latter case, only a shift is actually
491 grammatically correct. Thus, the parser would report a syntax error for the
492 grammatically correct sentence "baab" because it would encounter a syntax
493 error after that incorrect reduction.
494
495 Despite not being LALR(1), Menhir version 20070322 suffers from this problem
496 as well. It uses David Pager's weak compatibility test for merging states.
497 Bison and Menhir accept non-LR(1) grammars with conflict resolution. Pager
498 designed his algorithm only for LR(1) grammars. */
499A: 'a' 'a' /* rule 4 */
500 | 'a' /* rule 5 */
501 ;
502
503/* Rule 3, rule 6, and rule 7 ensure that Bison does not report rule 4 as
504 useless after conflict resolution. This proves that, even though LALR(1)
505 generates incorrect parser tables sometimes, Bison will not necessarily
506 produce any warning to help the user realize it. */
507c: 'a' 'b' /* rule 6 */
508 | A /* rule 7 */
509 ;
510]],
511
512dnl INPUT
513[['b', 'a', 'a', 'b']],
514
515dnl BISON-STDERR
516[],
517
518dnl TABLES
d42fe46e 519[[State 0
db34f798
JD
520
521 0 $accept: . S $end
522 1 S: . 'a' A 'a'
523 2 | . 'b' A 'b'
524 3 | . 'c' c
525
526 'a' shift, and go to state 1
527 'b' shift, and go to state 2
528 'c' shift, and go to state 3
529
530 S go to state 4
531
532
d42fe46e 533State 1
db34f798
JD
534
535 1 S: 'a' . A 'a'
536 4 A: . 'a' 'a'
537 5 | . 'a'
538
539 'a' shift, and go to state 5
540
541 A go to state 6
542
543
d42fe46e 544State 2
db34f798
JD
545
546 2 S: 'b' . A 'b'
547 4 A: . 'a' 'a'
548 5 | . 'a'
549
550 'a' shift, and go to state ]AT_COND_CASE([[LALR]], [[5]], [[16]])[
551
552 A go to state 7
553
554
d42fe46e 555State 3
db34f798
JD
556
557 3 S: 'c' . c
558 4 A: . 'a' 'a'
559 5 | . 'a'
560 6 c: . 'a' 'b'
561 7 | . A
562
563 'a' shift, and go to state 8
564
565 A go to state 9
566 c go to state 10
567
568
d42fe46e 569State 4
db34f798
JD
570
571 0 $accept: S . $end
572
573 $end shift, and go to state 11
574
575
d42fe46e 576State 5
db34f798
JD
577
578 4 A: 'a' . 'a'
579 5 | 'a' . ]AT_COND_CASE([[LALR]], [[['a', 'b']]], [[['a']]])[
580
581 ]AT_COND_CASE([[canonical LR]], [['a']],
582 [[$default]])[ reduce using rule 5 (A)
583
584 Conflict between rule 5 and token 'a' resolved as reduce (%left 'a').
585
586
d42fe46e 587State 6
db34f798
JD
588
589 1 S: 'a' A . 'a'
590
591 'a' shift, and go to state 13
592
593
d42fe46e 594State 7
db34f798
JD
595
596 2 S: 'b' A . 'b'
597
598 'b' shift, and go to state 14
599
600
d42fe46e 601State 8
db34f798
JD
602
603 4 A: 'a' . 'a'
604 5 | 'a' . [$end]
605 6 c: 'a' . 'b'
606
607 'a' shift, and go to state ]AT_COND_CASE([[canonical LR]], [[17]],
608 [[12]])[
609 'b' shift, and go to state 15
610
611 ]AT_COND_CASE([[canonical LR]], [[$end]],
612 [[$default]])[ reduce using rule 5 (A)
613
614
d42fe46e 615State 9
db34f798
JD
616
617 7 c: A .]AT_COND_CASE([[canonical LR]], [[ [$end]]])[
618
619 ]AT_COND_CASE([[canonical LR]], [[$end]],
620 [[$default]])[ reduce using rule 7 (c)
621
622
d42fe46e 623State 10
db34f798
JD
624
625 3 S: 'c' c .]AT_COND_CASE([[canonical LR]], [[ [$end]]])[
626
627 ]AT_COND_CASE([[canonical LR]], [[$end]],
628 [[$default]])[ reduce using rule 3 (S)
629
630
d42fe46e 631State 11
db34f798
JD
632
633 0 $accept: S $end .
634
635 $default accept
636
637
d42fe46e 638State 12
db34f798
JD
639
640 4 A: 'a' 'a' .]AT_COND_CASE([[canonical LR]], [[ ['a']]])[
641
642 ]AT_COND_CASE([[canonical LR]], [['a']],
643 [[$default]])[ reduce using rule 4 (A)
644
645
d42fe46e 646State 13
db34f798
JD
647
648 1 S: 'a' A 'a' .]AT_COND_CASE([[canonical LR]], [[ [$end]]])[
649
650 ]AT_COND_CASE([[canonical LR]], [[$end]],
651 [[$default]])[ reduce using rule 1 (S)
652
653
d42fe46e 654State 14
db34f798
JD
655
656 2 S: 'b' A 'b' .]AT_COND_CASE([[canonical LR]], [[ [$end]]])[
657
658 ]AT_COND_CASE([[canonical LR]], [[$end]],
659 [[$default]])[ reduce using rule 2 (S)
660
661
d42fe46e 662State 15
db34f798
JD
663
664 6 c: 'a' 'b' .]AT_COND_CASE([[canonical LR]], [[ [$end]]])[
665
666 ]AT_COND_CASE([[canonical LR]], [[$end]],
667 [[$default]])[ reduce using rule 6 (c)]AT_COND_CASE([[LALR]],
668 [[]], [[
669
670
d42fe46e 671State 16
db34f798
JD
672
673 4 A: 'a' . 'a'
674 5 | 'a' . ['b']
675
676 'a' shift, and go to state ]AT_COND_CASE([[canonical LR]], [[18]],
677 [[12]])[
678
679 ]AT_COND_CASE([[canonical LR]], [['b']],
680 [[$default]])[ reduce using rule 5 (A)]AT_COND_CASE([[canonical LR]], [[
681
682
d42fe46e 683State 17
db34f798
JD
684
685 4 A: 'a' 'a' . [$end]
686
687 $end reduce using rule 4 (A)
688
689
d42fe46e 690State 18
db34f798
JD
691
692 4 A: 'a' 'a' . ['b']
693
694 'b' reduce using rule 4 (A)]])])[
695]],
696
697dnl OTHER-CHECKS
698[],
699
700dnl PARSER-EXIT-VALUE, PARSER-STDOUT, PARSER-STDERR
701[AT_COND_CASE([[LALR]], [[1]], [[0]])],
702[],
703[AT_COND_CASE([[LALR]],
704[[syntax error
705]])])
706
707AT_TEST_LR_TYPE([[Lane Split]],
708[[%left 'a'
709// Conflict resolution renders state 16 unreachable for canonical LR(1). We
710// keep it so that the paser table diff is easier to code.
f3bc3386 711%define lr.keep-unreachable-state]],
db34f798
JD
712[[
713/* Similar to the last test case set but two states must be split. */
714S: 'a' A 'a' /* rule 1 */
715 | 'b' A 'b' /* rule 2 */
716 | 'c' c /* rule 3 */
717 ;
718
719A: 'a' 'a' 'a' /* rule 4 */
720 | 'a' 'a' /* rule 5 */
721 ;
722
723c: 'a' 'a' 'b' /* rule 6 */
724 | A /* rule 7 */
725 ;
726]],
727
728dnl INPUT
729[['b', 'a', 'a', 'a', 'b']],
730
731dnl BISON-STDERR
732[],
733
734dnl TABLES
d42fe46e 735[[State 0
db34f798
JD
736
737 0 $accept: . S $end
738 1 S: . 'a' A 'a'
739 2 | . 'b' A 'b'
740 3 | . 'c' c
741
742 'a' shift, and go to state 1
743 'b' shift, and go to state 2
744 'c' shift, and go to state 3
745
746 S go to state 4
747
748
d42fe46e 749State 1
db34f798
JD
750
751 1 S: 'a' . A 'a'
752 4 A: . 'a' 'a' 'a'
753 5 | . 'a' 'a'
754
755 'a' shift, and go to state 5
756
757 A go to state 6
758
759
d42fe46e 760State 2
db34f798
JD
761
762 2 S: 'b' . A 'b'
763 4 A: . 'a' 'a' 'a'
764 5 | . 'a' 'a'
765
766 'a' shift, and go to state ]AT_COND_CASE([[LALR]], [[5]], [[18]])[
767
768 A go to state 7
769
770
d42fe46e 771State 3
db34f798
JD
772
773 3 S: 'c' . c
774 4 A: . 'a' 'a' 'a'
775 5 | . 'a' 'a'
776 6 c: . 'a' 'a' 'b'
777 7 | . A
778
779 'a' shift, and go to state 8
780
781 A go to state 9
782 c go to state 10
783
784
d42fe46e 785State 4
db34f798
JD
786
787 0 $accept: S . $end
788
789 $end shift, and go to state 11
790
791
d42fe46e 792State 5
db34f798
JD
793
794 4 A: 'a' . 'a' 'a'
795 5 | 'a' . 'a'
796
797 'a' shift, and go to state 12
798
799
d42fe46e 800State 6
db34f798
JD
801
802 1 S: 'a' A . 'a'
803
804 'a' shift, and go to state 13
805
806
d42fe46e 807State 7
db34f798
JD
808
809 2 S: 'b' A . 'b'
810
811 'b' shift, and go to state 14
812
813
d42fe46e 814State 8
db34f798
JD
815
816 4 A: 'a' . 'a' 'a'
817 5 | 'a' . 'a'
818 6 c: 'a' . 'a' 'b'
819
820 'a' shift, and go to state 15
821
822
d42fe46e 823State 9
db34f798
JD
824
825 7 c: A .]AT_COND_CASE([[canonical LR]], [[ [$end]]])[
826
827 ]AT_COND_CASE([[canonical LR]], [[$end]],
828 [[$default]])[ reduce using rule 7 (c)
829
830
d42fe46e 831State 10
db34f798
JD
832
833 3 S: 'c' c .]AT_COND_CASE([[canonical LR]], [[ [$end]]])[
834
835 ]AT_COND_CASE([[canonical LR]], [[$end]],
836 [[$default]])[ reduce using rule 3 (S)
837
838
d42fe46e 839State 11
db34f798
JD
840
841 0 $accept: S $end .
842
843 $default accept
844
845
d42fe46e 846State 12
db34f798
JD
847
848 4 A: 'a' 'a' . 'a'
849 5 | 'a' 'a' . ]AT_COND_CASE([[LALR]], [[['a', 'b']]], [[['a']]])[
850
851 ]AT_COND_CASE([[canonical LR]], [['a']],
852 [[$default]])[ reduce using rule 5 (A)
853
854 Conflict between rule 5 and token 'a' resolved as reduce (%left 'a').
855
856
d42fe46e 857State 13
db34f798
JD
858
859 1 S: 'a' A 'a' .]AT_COND_CASE([[canonical LR]], [[ [$end]]])[
860
861 ]AT_COND_CASE([[canonical LR]], [[$end]],
862 [[$default]])[ reduce using rule 1 (S)
863
864
d42fe46e 865State 14
db34f798
JD
866
867 2 S: 'b' A 'b' .]AT_COND_CASE([[canonical LR]], [[ [$end]]])[
868
869 ]AT_COND_CASE([[canonical LR]], [[$end]],
870 [[$default]])[ reduce using rule 2 (S)
871
872
d42fe46e 873State 15
db34f798
JD
874
875 4 A: 'a' 'a' . 'a'
876 5 | 'a' 'a' . [$end]
877 6 c: 'a' 'a' . 'b'
878
879 'a' shift, and go to state ]AT_COND_CASE([[canonical LR]], [[19]],
880 [[16]])[
881 'b' shift, and go to state 17
882
883 ]AT_COND_CASE([[canonical LR]], [[$end]],
884 [[$default]])[ reduce using rule 5 (A)
885
886
d42fe46e 887State 16
db34f798
JD
888
889 4 A: 'a' 'a' 'a' .]AT_COND_CASE([[canonical LR]], [[ ['a']]])[
890
891 ]AT_COND_CASE([[canonical LR]], [['a']],
892 [[$default]])[ reduce using rule 4 (A)
893
894
d42fe46e 895State 17
db34f798
JD
896
897 6 c: 'a' 'a' 'b' .]AT_COND_CASE([[canonical LR]], [[ [$end]]])[
898
899 ]AT_COND_CASE([[canonical LR]], [[$end]],
900 [[$default]])[ reduce using rule 6 (c)]AT_COND_CASE([[LALR]],
901 [[]], [[
902
903
d42fe46e 904State 18
db34f798
JD
905
906 4 A: 'a' . 'a' 'a'
907 5 | 'a' . 'a'
908
909 'a' shift, and go to state ]AT_COND_CASE([[canonical LR]], [[20]],
910 [[19]])[
911
912
d42fe46e 913State 19]AT_COND_CASE([[canonical LR]], [[
db34f798
JD
914
915 4 A: 'a' 'a' 'a' .]AT_COND_CASE([[canonical LR]], [[ [$end]]])[
916
917 ]AT_COND_CASE([[canonical LR]], [[$end]],
918 [[$default]])[ reduce using rule 4 (A)
919
920
d42fe46e 921State 20]])[
db34f798
JD
922
923 4 A: 'a' 'a' . 'a'
924 5 | 'a' 'a' . ['b']
925
926 'a' shift, and go to state ]AT_COND_CASE([[canonical LR]], [[21]],
927 [[16]])[
928
929 ]AT_COND_CASE([[canonical LR]], [['b']],
930 [[$default]])[ reduce using rule 5 (A)]AT_COND_CASE([[canonical LR]], [[
931
932
d42fe46e 933State 21
db34f798
JD
934
935 4 A: 'a' 'a' 'a' .]AT_COND_CASE([[canonical LR]], [[ ['b']]])[
936
937 ]AT_COND_CASE([[canonical LR]], [['b']],
938 [[$default]])[ reduce using rule 4 (A)]])])[
939]],
940
941dnl OTHER-CHECKS
942[],
943
944dnl PARSER-EXIT-VALUE, PARSER-STDOUT, PARSER-STDERR
945[AT_COND_CASE([[LALR]], [[1]], [[0]])],
946[],
947[AT_COND_CASE([[LALR]],
948[[syntax error
949]])])
950
951AT_TEST_LR_TYPE([[Complex Lane Split]],
952[[%left 'a'
953// Conflict resolution renders state 16 unreachable for canonical LR(1). We
954// keep it so that the paser table diff is easier to code.
f3bc3386 955%define lr.keep-unreachable-state]],
db34f798
JD
956[[
957/* Similar to the last test case set but forseeing the S/R conflict from the
958 first state that must be split is becoming difficult. Imagine if B were
959 even more complex. Imagine if A had other RHS's ending in other
960 nonterminals. */
961S: 'a' A 'a'
962 | 'b' A 'b'
963 | 'c' c
964 ;
965A: 'a' 'a' B
966 ;
967B: 'a'
968 | %prec 'a'
969 ;
970c: 'a' 'a' 'b'
971 | A
972 ;
973]],
974
975dnl INPUT
976[['b', 'a', 'a', 'a', 'b']],
977
978dnl BISON-STDERR
979[],
980
981dnl TABLES
d42fe46e 982[[State 0
db34f798
JD
983
984 0 $accept: . S $end
985 1 S: . 'a' A 'a'
986 2 | . 'b' A 'b'
987 3 | . 'c' c
988
989 'a' shift, and go to state 1
990 'b' shift, and go to state 2
991 'c' shift, and go to state 3
992
993 S go to state 4
994
995
d42fe46e 996State 1
db34f798
JD
997
998 1 S: 'a' . A 'a'
999 4 A: . 'a' 'a' B
1000
1001 'a' shift, and go to state 5
1002
1003 A go to state 6
1004
1005
d42fe46e 1006State 2
db34f798
JD
1007
1008 2 S: 'b' . A 'b'
1009 4 A: . 'a' 'a' B
1010
1011 'a' shift, and go to state ]AT_COND_CASE([[LALR]], [[5]], [[19]])[
1012
1013 A go to state 7
1014
1015
d42fe46e 1016State 3
db34f798
JD
1017
1018 3 S: 'c' . c
1019 4 A: . 'a' 'a' B
1020 7 c: . 'a' 'a' 'b'
1021 8 | . A
1022
1023 'a' shift, and go to state 8
1024
1025 A go to state 9
1026 c go to state 10
1027
1028
d42fe46e 1029State 4
db34f798
JD
1030
1031 0 $accept: S . $end
1032
1033 $end shift, and go to state 11
1034
1035
d42fe46e 1036State 5
db34f798
JD
1037
1038 4 A: 'a' . 'a' B
1039
1040 'a' shift, and go to state 12
1041
1042
d42fe46e 1043State 6
db34f798
JD
1044
1045 1 S: 'a' A . 'a'
1046
1047 'a' shift, and go to state 13
1048
1049
d42fe46e 1050State 7
db34f798
JD
1051
1052 2 S: 'b' A . 'b'
1053
1054 'b' shift, and go to state 14
1055
1056
d42fe46e 1057State 8
db34f798
JD
1058
1059 4 A: 'a' . 'a' B
1060 7 c: 'a' . 'a' 'b'
1061
1062 'a' shift, and go to state 15
1063
1064
d42fe46e 1065State 9
db34f798
JD
1066
1067 8 c: A .]AT_COND_CASE([[canonical LR]], [[ [$end]]])[
1068
1069 ]AT_COND_CASE([[canonical LR]], [[$end]],
1070 [[$default]])[ reduce using rule 8 (c)
1071
1072
d42fe46e 1073State 10
db34f798
JD
1074
1075 3 S: 'c' c .]AT_COND_CASE([[canonical LR]], [[ [$end]]])[
1076
1077 ]AT_COND_CASE([[canonical LR]], [[$end]],
1078 [[$default]])[ reduce using rule 3 (S)
1079
1080
d42fe46e 1081State 11
db34f798
JD
1082
1083 0 $accept: S $end .
1084
1085 $default accept
1086
1087
d42fe46e 1088State 12
db34f798
JD
1089
1090 4 A: 'a' 'a' . B
1091 5 B: . 'a'
1092 6 | . ]AT_COND_CASE([[LALR]], [[['a', 'b']]], [[['a']]])[
1093
1094 ]AT_COND_CASE([[canonical LR]], [['a']],
1095 [[$default]])[ reduce using rule 6 (B)
1096
1097 B go to state 17
1098
1099 Conflict between rule 6 and token 'a' resolved as reduce (%left 'a').
1100
1101
d42fe46e 1102State 13
db34f798
JD
1103
1104 1 S: 'a' A 'a' .]AT_COND_CASE([[canonical LR]], [[ [$end]]])[
1105
1106 ]AT_COND_CASE([[canonical LR]], [[$end]],
1107 [[$default]])[ reduce using rule 1 (S)
1108
1109
d42fe46e 1110State 14
db34f798
JD
1111
1112 2 S: 'b' A 'b' .]AT_COND_CASE([[canonical LR]], [[ [$end]]])[
1113
1114 ]AT_COND_CASE([[canonical LR]], [[$end]],
1115 [[$default]])[ reduce using rule 2 (S)
1116
1117
d42fe46e 1118State 15
db34f798
JD
1119
1120 4 A: 'a' 'a' . B
1121 5 B: . 'a'
1122 6 | . [$end]
1123 7 c: 'a' 'a' . 'b'
1124
1125 'a' shift, and go to state ]AT_COND_CASE([[canonical LR]], [[20]],
1126 [[16]])[
1127 'b' shift, and go to state 18
1128
1129 ]AT_COND_CASE([[canonical LR]], [[$end]],
1130 [[$default]])[ reduce using rule 6 (B)
1131
1132 B go to state ]AT_COND_CASE([[canonical LR]], [[21]], [[17]])[
1133
1134
d42fe46e 1135State 16
db34f798
JD
1136
1137 5 B: 'a' .]AT_COND_CASE([[canonical LR]], [[ ['a']]])[
1138
1139 ]AT_COND_CASE([[canonical LR]], [['a']],
1140 [[$default]])[ reduce using rule 5 (B)
1141
1142
d42fe46e 1143State 17
db34f798
JD
1144
1145 4 A: 'a' 'a' B .]AT_COND_CASE([[canonical LR]], [[ ['a']]])[
1146
1147 ]AT_COND_CASE([[canonical LR]], [['a']],
1148 [[$default]])[ reduce using rule 4 (A)
1149
1150
d42fe46e 1151State 18
db34f798
JD
1152
1153 7 c: 'a' 'a' 'b' .]AT_COND_CASE([[canonical LR]], [[ [$end]]])[
1154
1155 ]AT_COND_CASE([[canonical LR]], [[$end]],
1156 [[$default]])[ reduce using rule 7 (c)]AT_COND_CASE([[LALR]], [], [[
1157
1158
d42fe46e 1159State 19
db34f798
JD
1160
1161 4 A: 'a' . 'a' B
1162
1163 'a' shift, and go to state ]AT_COND_CASE([[canonical LR]], [[22]],
1164 [[20]])[
1165
1166
d42fe46e 1167State 20]AT_COND_CASE([[canonical LR]], [[
db34f798
JD
1168
1169 5 B: 'a' . [$end]
1170
1171 $end reduce using rule 5 (B)
1172
1173
d42fe46e 1174State 21
db34f798
JD
1175
1176 4 A: 'a' 'a' B . [$end]
1177
1178 $end reduce using rule 4 (A)
1179
1180
d42fe46e 1181State 22]])[
db34f798
JD
1182
1183 4 A: 'a' 'a' . B
1184 5 B: . 'a'
1185 6 | . ['b']
1186
1187 'a' shift, and go to state ]AT_COND_CASE([[canonical LR]], [[23]],
1188 [[16]])[
1189
1190 ]AT_COND_CASE([[canonical LR]], [['b']],
1191 [[$default]])[ reduce using rule 6 (B)
1192
1193 B go to state ]AT_COND_CASE([[canonical LR]], [[24
1194
1195
d42fe46e 1196State 23
db34f798
JD
1197
1198 5 B: 'a' . ['b']
1199
1200 'b' reduce using rule 5 (B)
1201
1202
d42fe46e 1203State 24
db34f798
JD
1204
1205 4 A: 'a' 'a' B . ['b']
1206
1207 'b' reduce using rule 4 (A)]], [[17]])])[
1208]],
1209
1210dnl OTHER-CHECKS
1211[],
1212
1213dnl PARSER-EXIT-VALUE, PARSER-STDOUT, PARSER-STDERR
1214[AT_COND_CASE([[LALR]], [[1]], [[0]])],
1215[],
1216[AT_COND_CASE([[LALR]],
1217[[syntax error
1218]])])
1219
1220AT_TEST_LR_TYPE([[Split During Added Lookahead Propagation]],
f3bc3386 1221[[%define lr.keep-unreachable-state]],
db34f798
JD
1222[[
1223/* The partial state chart diagram below is for LALR(1). State 0 is the start
1224 state. States are iterated for successor construction in numerical order.
1225 Transitions are downwards.
1226
1227 State 13 has a R/R conflict that cannot be predicted by Bison's LR(1)
1228 algorithm using annotations alone. That is, when state 11's successor on
1229 'd' is merged with state 5 (which is originally just state 1's successor on
1230 'd'), state 5's successor on 'e' must then be changed because the resulting
1231 lookaheads that propagate to it now make it incompatible with state 8's
1232 successor on 'e'. In other words, state 13 must be split to avoid the
1233 conflict.
1234
1235 0
1236 / | \
1237 a / c| \ b
1238 1 3 2
1239 | | |
1240 d| |c | d
1241 | 11 |
1242 | | |
1243 \ /d |
1244 5 8
1245 \ |
1246 e \ / e
1247 13
1248 R/R
1249
1250 This grammar is designed carefully to make sure that, despite Bison's LR(1)
1251 algorithm's bread-first iteration of transitions to reconstruct states,
1252 state 11's successors are constructed after state 5's and state 8's.
1253 Otherwise (for example, if you remove the first 'c' in each of rules 6 and
1254 7), state 5's successor on 'e' would never be merged with state 8's, so the
1255 split of the resulting state 13 would never need to be performed. */
1256S: 'a' A 'f'
1257 | 'a' B
1258 | 'b' A 'f'
1259 | 'b' B 'g'
1260 | 'b' 'd'
1261 | 'c' 'c' A 'g'
1262 | 'c' 'c' B
1263 ;
1264A: 'd' 'e' ;
1265B: 'd' 'e' ;
1266]],
1267
1268dnl INPUT
1269[['b', 'd', 'e', 'g']],
1270
1271dnl BISON-STDERR
1272[AT_COND_CASE([[LALR]],
d87ea54c 1273[[input.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr]
db34f798
JD
1274]], [])],
1275
1276dnl TABLES
d42fe46e 1277[[State 0
db34f798
JD
1278
1279 0 $accept: . S $end
1280 1 S: . 'a' A 'f'
1281 2 | . 'a' B
1282 3 | . 'b' A 'f'
1283 4 | . 'b' B 'g'
1284 5 | . 'b' 'd'
1285 6 | . 'c' 'c' A 'g'
1286 7 | . 'c' 'c' B
1287
1288 'a' shift, and go to state 1
1289 'b' shift, and go to state 2
1290 'c' shift, and go to state 3
1291
1292 S go to state 4
1293
1294
d42fe46e 1295State 1
db34f798
JD
1296
1297 1 S: 'a' . A 'f'
1298 2 | 'a' . B
1299 8 A: . 'd' 'e'
1300 9 B: . 'd' 'e'
1301
1302 'd' shift, and go to state 5
1303
1304 A go to state 6
1305 B go to state 7
1306
1307
d42fe46e 1308State 2
db34f798
JD
1309
1310 3 S: 'b' . A 'f'
1311 4 | 'b' . B 'g'
1312 5 | 'b' . 'd'
1313 8 A: . 'd' 'e'
1314 9 B: . 'd' 'e'
1315
1316 'd' shift, and go to state 8
1317
1318 A go to state 9
1319 B go to state 10
1320
1321
d42fe46e 1322State 3
db34f798
JD
1323
1324 6 S: 'c' . 'c' A 'g'
1325 7 | 'c' . 'c' B
1326
1327 'c' shift, and go to state 11
1328
1329
d42fe46e 1330State 4
db34f798
JD
1331
1332 0 $accept: S . $end
1333
1334 $end shift, and go to state 12
1335
1336
d42fe46e 1337State 5
db34f798
JD
1338
1339 8 A: 'd' . 'e'
1340 9 B: 'd' . 'e'
1341
1342 'e' shift, and go to state ]AT_COND_CASE([[LALR]], [[13]],
1343 [[canonical LR]], [[13]],
1344 [[20]])[
1345
1346
d42fe46e 1347State 6
db34f798
JD
1348
1349 1 S: 'a' A . 'f'
1350
1351 'f' shift, and go to state 14
1352
1353
d42fe46e 1354State 7
db34f798
JD
1355
1356 2 S: 'a' B .]AT_COND_CASE([[canonical LR]], [[ [$end]]])[
1357
1358 ]AT_COND_CASE([[canonical LR]], [[$end]],
1359 [[$default]])[ reduce using rule 2 (S)
1360
1361
d42fe46e 1362State 8
db34f798
JD
1363
1364 5 S: 'b' 'd' . [$end]
1365 8 A: 'd' . 'e'
1366 9 B: 'd' . 'e'
1367
1368 'e' shift, and go to state ]AT_COND_CASE([[canonical LR]], [[20]],
1369 [[13]])[
1370
1371 ]AT_COND_CASE([[canonical LR]], [[$end]],
1372 [[$default]])[ reduce using rule 5 (S)
1373
1374
d42fe46e 1375State 9
db34f798
JD
1376
1377 3 S: 'b' A . 'f'
1378
1379 'f' shift, and go to state 15
1380
1381
d42fe46e 1382State 10
db34f798
JD
1383
1384 4 S: 'b' B . 'g'
1385
1386 'g' shift, and go to state 16
1387
1388
d42fe46e 1389State 11
db34f798
JD
1390
1391 6 S: 'c' 'c' . A 'g'
1392 7 | 'c' 'c' . B
1393 8 A: . 'd' 'e'
1394 9 B: . 'd' 'e'
1395
1396 'd' shift, and go to state ]AT_COND_CASE([[canonical LR]], [[21]],
1397 [[5]])[
1398
1399 A go to state 17
1400 B go to state 18
1401
1402
d42fe46e 1403State 12
db34f798
JD
1404
1405 0 $accept: S $end .
1406
1407 $default accept]AT_COND_CASE([[LALR]], [[
1408
1409
d42fe46e 1410State 13
db34f798
JD
1411
1412 8 A: 'd' 'e' . ['f', 'g']
1413 9 B: 'd' 'e' . [$end, 'g']
1414
1415 $end reduce using rule 9 (B)
1416 'g' reduce using rule 8 (A)
1417 'g' [reduce using rule 9 (B)]
1418 $default reduce using rule 8 (A)]], [[
1419
1420
d42fe46e 1421State 13
db34f798
JD
1422
1423 8 A: 'd' 'e' . ['f']
1424 9 B: 'd' 'e' . ]AT_COND_CASE([[canonical LR]], [[[$end]]], [[['g']]])[
1425
1426 ]AT_COND_CASE([[canonical LR]], [[$end]],
1427 [['g' ]])[ reduce using rule 9 (B)
1428 ]AT_COND_CASE([[canonical LR]], [['f' ]],
1429 [[$default]])[ reduce using rule 8 (A)]])[
1430
1431
d42fe46e 1432State 14
db34f798
JD
1433
1434 1 S: 'a' A 'f' .]AT_COND_CASE([[canonical LR]], [[ [$end]]])[
1435
1436 ]AT_COND_CASE([[canonical LR]], [[$end]],
1437 [[$default]])[ reduce using rule 1 (S)
1438
1439
d42fe46e 1440State 15
db34f798
JD
1441
1442 3 S: 'b' A 'f' .]AT_COND_CASE([[canonical LR]], [[ [$end]]])[
1443
1444 ]AT_COND_CASE([[canonical LR]], [[$end]],
1445 [[$default]])[ reduce using rule 3 (S)
1446
1447
d42fe46e 1448State 16
db34f798
JD
1449
1450 4 S: 'b' B 'g' .]AT_COND_CASE([[canonical LR]], [[ [$end]]])[
1451
1452 ]AT_COND_CASE([[canonical LR]], [[$end]],
1453 [[$default]])[ reduce using rule 4 (S)
1454
1455
d42fe46e 1456State 17
db34f798
JD
1457
1458 6 S: 'c' 'c' A . 'g'
1459
1460 'g' shift, and go to state 19
1461
1462
d42fe46e 1463State 18
db34f798
JD
1464
1465 7 S: 'c' 'c' B .]AT_COND_CASE([[canonical LR]], [[ [$end]]])[
1466
1467 ]AT_COND_CASE([[canonical LR]], [[$end]],
1468 [[$default]])[ reduce using rule 7 (S)
1469
1470
d42fe46e 1471State 19
db34f798
JD
1472
1473 6 S: 'c' 'c' A 'g' .]AT_COND_CASE([[canonical LR]], [[ [$end]]])[
1474
1475 ]AT_COND_CASE([[canonical LR]], [[$end]],
1476 [[$default]])[ reduce using rule 6 (S)]AT_COND_CASE([[LALR]],
1477 [[]], [[
1478
1479
d42fe46e 1480State 20]AT_COND_CASE([[canonical LR]], [[
db34f798
JD
1481
1482 8 A: 'd' 'e' . ['f']
1483 9 B: 'd' 'e' . ['g']
1484
1485 'f' reduce using rule 8 (A)
1486 'g' reduce using rule 9 (B)
1487
1488
d42fe46e 1489State 21
db34f798
JD
1490
1491 8 A: 'd' . 'e'
1492 9 B: 'd' . 'e'
1493
1494 'e' shift, and go to state 22
1495
1496
d42fe46e 1497State 22
db34f798
JD
1498
1499 8 A: 'd' 'e' . ['g']
1500 9 B: 'd' 'e' . [$end]
1501
1502 $end reduce using rule 9 (B)
1503 'g' reduce using rule 8 (A)]], [[
1504
1505 8 A: 'd' 'e' . ['f', 'g']
1506 9 B: 'd' 'e' . [$end]
1507
1508 $end reduce using rule 9 (B)
1509 $default reduce using rule 8 (A)]])])[
1510]],
1511
1512dnl OTHER-CHECKS
1513[],
1514
1515dnl PARSER-EXIT-VALUE, PARSER-STDOUT, PARSER-STDERR
1516[AT_COND_CASE([[LALR]], [[1]], [[0]])],
1517[],
1518[AT_COND_CASE([[LALR]],
1519[[syntax error
1520]])])
1521
1522
1523
110ef36a 1524## ------------------------------- ##
f3bc3386 1525## %define lr.default-reduction. ##
110ef36a 1526## ------------------------------- ##
7254f6a8 1527
110ef36a
JD
1528# AT_TEST_LR_DEFAULT_REDUCTIONS(GRAMMAR, INPUT, TABLES)
1529# -----------------------------------------------------
1530m4_define([AT_TEST_LR_DEFAULT_REDUCTIONS],
7254f6a8 1531[
f3bc3386 1532AT_TEST_TABLES_AND_PARSE([[no %define lr.default-reduction]],
f0ad1b2f 1533 [[most]], [[]],
7254f6a8
JD
1534 [[]],
1535 [$1], [$2], [[]], [$3])
f3bc3386 1536AT_TEST_TABLES_AND_PARSE([[%define lr.default-reduction most]],
f0ad1b2f 1537 [[most]], [[]],
f3bc3386 1538 [[%define lr.default-reduction most]],
7254f6a8 1539 [$1], [$2], [[]], [$3])
f3bc3386 1540AT_TEST_TABLES_AND_PARSE([[%define lr.default-reduction consistent]],
7254f6a8 1541 [[consistent]], [[]],
f3bc3386 1542 [[%define lr.default-reduction consistent]],
7254f6a8 1543 [$1], [$2], [[]], [$3])
f3bc3386 1544AT_TEST_TABLES_AND_PARSE([[%define lr.default-reduction accepting]],
7254f6a8 1545 [[accepting]], [[]],
f3bc3386 1546 [[%define lr.default-reduction accepting]],
7254f6a8
JD
1547 [$1], [$2], [[]], [$3])
1548])
1549
110ef36a 1550AT_TEST_LR_DEFAULT_REDUCTIONS([[
7254f6a8
JD
1551/* The start state is consistent and has a shift on 'a' and no reductions.
1552 After pushing the b below, enter an inconsistent state that has a shift and
1553 one reduction with one lookahead. */
1554start:
1555 a b
1556 | a b 'a'
1557 | a c 'b'
1558 ;
1559
1560/* After shifting this 'a', enter a consistent state that has no shift and 1
1561 reduction with multiple lookaheads. */
1562a: 'a' ;
1563
1564/* After the previous reduction, enter an inconsistent state that has no shift
1565 and multiple reductions. The first reduction has more lookaheads than the
110ef36a 1566 second, so the first should always be preferred as the default reduction if
7254f6a8
JD
1567 enabled. The second reduction has one lookahead. */
1568b: ;
1569c: ;
1570]],
1571dnl Visit each state mentioned above.
1572[['a', 'a']],
d42fe46e 1573[[State 0
7254f6a8
JD
1574
1575 0 $accept: . start $end
1576 1 start: . a b
1577 2 | . a b 'a'
1578 3 | . a c 'b'
1579 4 a: . 'a'
1580
1581 'a' shift, and go to state 1
1582
1583 start go to state 2
1584 a go to state 3
1585
1586
d42fe46e 1587State 1
7254f6a8
JD
1588
1589 4 a: 'a' .]AT_COND_CASE([[accepting]], [[ [$end, 'a', 'b']
1590
1591 $end reduce using rule 4 (a)
1592 'a' reduce using rule 4 (a)
1593 'b' reduce using rule 4 (a)]], [[
1594
1595 $default reduce using rule 4 (a)]])[
1596
1597
d42fe46e 1598State 2
7254f6a8
JD
1599
1600 0 $accept: start . $end
1601
1602 $end shift, and go to state 4
1603
1604
d42fe46e 1605State 3
7254f6a8
JD
1606
1607 1 start: a . b
1608 2 | a . b 'a'
1609 3 | a . c 'b'
1610 5 b: . [$end, 'a']
f0ad1b2f 1611 6 c: . ['b']]AT_COND_CASE([[most]], [[
7254f6a8
JD
1612
1613 'b' reduce using rule 6 (c)
1614 $default reduce using rule 5 (b)]], [[
1615
1616 $end reduce using rule 5 (b)
1617 'a' reduce using rule 5 (b)
1618 'b' reduce using rule 6 (c)]])[
1619
1620 b go to state 5
1621 c go to state 6
1622
1623
d42fe46e 1624State 4
7254f6a8
JD
1625
1626 0 $accept: start $end .
1627
1628 $default accept
1629
1630
d42fe46e 1631State 5
7254f6a8
JD
1632
1633 1 start: a b . [$end]
1634 2 | a b . 'a'
1635
1636 'a' shift, and go to state 7
1637
f0ad1b2f 1638 ]AT_COND_CASE([[most]], [[$default]],
32493bc8 1639 [[$end]])[ reduce using rule 1 (start)
7254f6a8
JD
1640
1641
d42fe46e 1642State 6
7254f6a8
JD
1643
1644 3 start: a c . 'b'
1645
1646 'b' shift, and go to state 8
1647
1648
d42fe46e 1649State 7
7254f6a8
JD
1650
1651 2 start: a b 'a' .]AT_COND_CASE([[accepting]], [[ [$end]
1652
1653 $end reduce using rule 2 (start)]], [[
1654
1655 $default reduce using rule 2 (start)]])[
1656
1657
d42fe46e 1658State 8
7254f6a8
JD
1659
1660 3 start: a c 'b' .]AT_COND_CASE([[accepting]], [[ [$end]
1661
1662 $end reduce using rule 3 (start)]], [[
1663
1664 $default reduce using rule 3 (start)]])[
1665]])