# Exercising Bison Grammar Reduction. -*- Autotest -*-
-# Copyright (C) 2001, 2002, 2007, 2008, 2009 Free Software Foundation,
-# Inc.
+
+# Copyright (C) 2001-2002, 2007-2012 Free Software Foundation, Inc.
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
useless9: '9';
]])
+AT_BISON_CHECK([[-fcaret input.y]], 0, [],
+[[input.y: warning: 9 nonterminals useless in grammar
+input.y: warning: 9 rules useless in grammar
+input.y:6.1-8: warning: nonterminal useless in grammar: useless1
+ useless1: '1';
+ ^^^^^^^^
+input.y:7.1-8: warning: nonterminal useless in grammar: useless2
+ useless2: '2';
+ ^^^^^^^^
+input.y:8.1-8: warning: nonterminal useless in grammar: useless3
+ useless3: '3';
+ ^^^^^^^^
+input.y:9.1-8: warning: nonterminal useless in grammar: useless4
+ useless4: '4';
+ ^^^^^^^^
+input.y:10.1-8: warning: nonterminal useless in grammar: useless5
+ useless5: '5';
+ ^^^^^^^^
+input.y:11.1-8: warning: nonterminal useless in grammar: useless6
+ useless6: '6';
+ ^^^^^^^^
+input.y:12.1-8: warning: nonterminal useless in grammar: useless7
+ useless7: '7';
+ ^^^^^^^^
+input.y:13.1-8: warning: nonterminal useless in grammar: useless8
+ useless8: '8';
+ ^^^^^^^^
+input.y:14.1-8: warning: nonterminal useless in grammar: useless9
+ useless9: '9';
+ ^^^^^^^^
+input.y:6.11-13: warning: rule useless in grammar
+ useless1: '1';
+ ^^^
+input.y:7.11-13: warning: rule useless in grammar
+ useless2: '2';
+ ^^^
+input.y:8.11-13: warning: rule useless in grammar
+ useless3: '3';
+ ^^^
+input.y:9.11-13: warning: rule useless in grammar
+ useless4: '4';
+ ^^^
+input.y:10.11-13: warning: rule useless in grammar
+ useless5: '5';
+ ^^^
+input.y:11.11-13: warning: rule useless in grammar
+ useless6: '6';
+ ^^^
+input.y:12.11-13: warning: rule useless in grammar
+ useless7: '7';
+ ^^^
+input.y:13.11-13: warning: rule useless in grammar
+ useless8: '8';
+ ^^^
+input.y:14.11-13: warning: rule useless in grammar
+ useless9: '9';
+ ^^^
+]])
+
AT_BISON_CHECK([[input.y]], 0, [],
[[input.y: warning: 9 nonterminals useless in grammar
input.y: warning: 9 rules useless in grammar
%%
]])
+AT_BISON_CHECK([[-fcaret not-reduced.y]], 0, [],
+[[not-reduced.y: warning: 2 nonterminals useless in grammar
+not-reduced.y: warning: 3 rules useless in grammar
+not-reduced.y:14.1-13: warning: nonterminal useless in grammar: not_reachable
+ not_reachable: useful { /* A not reachable action. */ }
+ ^^^^^^^^^^^^^
+not-reduced.y:11.6-19: warning: nonterminal useless in grammar: non_productive
+ | non_productive { /* A non productive action. */ }
+ ^^^^^^^^^^^^^^
+not-reduced.y:11.6-57: warning: rule useless in grammar
+ | non_productive { /* A non productive action. */ }
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+not-reduced.y:14.16-56: warning: rule useless in grammar
+ not_reachable: useful { /* A not reachable action. */ }
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+not-reduced.y:17.17-18.63: warning: rule useless in grammar
+ non_productive: non_productive useless_token
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+]])
+
AT_BISON_CHECK([[not-reduced.y]], 0, [],
[[not-reduced.y: warning: 2 nonterminals useless in grammar
not-reduced.y: warning: 3 rules useless in grammar
AT_TEST_TABLES_AND_PARSE([[no %define lr.type: ]$1],
[[LALR]], [[]],
[$2], m4_shiftn(2, $@))
-AT_TEST_TABLES_AND_PARSE([[%define lr.type "lalr": ]$1],
+AT_TEST_TABLES_AND_PARSE([[%define lr.type lalr: ]$1],
[[LALR]], [[]],
- [[%define lr.type "lalr"
+ [[%define lr.type lalr
]$2],
m4_shiftn(2, $@))
-AT_TEST_TABLES_AND_PARSE([[%define lr.type "ielr": ]$1],
+AT_TEST_TABLES_AND_PARSE([[%define lr.type ielr: ]$1],
[[IELR]], [[]],
- [[%define lr.type "ielr"
+ [[%define lr.type ielr
]$2],
m4_shiftn(2, $@))
-AT_TEST_TABLES_AND_PARSE([[%define lr.type "canonical-lr": ]$1],
+AT_TEST_TABLES_AND_PARSE([[%define lr.type canonical-lr: ]$1],
[[canonical LR]], [[]],
- [[%define lr.type "canonical-lr"
+ [[%define lr.type canonical-lr
]$2],
m4_shiftn(2, $@))
])
[],
dnl TABLES
-[[state 0
+[[State 0
0 $accept: . S $end
1 S: . 'a' A 'a'
S go to state 4
-state 1
+State 1
1 S: 'a' . A 'a'
4 A: . 'a' 'a'
A go to state 6
-state 2
+State 2
2 S: 'b' . A 'b'
4 A: . 'a' 'a'
A go to state 7
-state 3
+State 3
3 S: 'c' . c
4 A: . 'a' 'a'
c go to state 10
-state 4
+State 4
0 $accept: S . $end
$end shift, and go to state 11
-state 5
+State 5
4 A: 'a' . 'a'
5 | 'a' . ]AT_COND_CASE([[LALR]], [[['a', 'b']]], [[['a']]])[
Conflict between rule 5 and token 'a' resolved as reduce (%left 'a').
-state 6
+State 6
1 S: 'a' A . 'a'
'a' shift, and go to state 13
-state 7
+State 7
2 S: 'b' A . 'b'
'b' shift, and go to state 14
-state 8
+State 8
4 A: 'a' . 'a'
5 | 'a' . [$end]
[[$default]])[ reduce using rule 5 (A)
-state 9
+State 9
7 c: A .]AT_COND_CASE([[canonical LR]], [[ [$end]]])[
[[$default]])[ reduce using rule 7 (c)
-state 10
+State 10
3 S: 'c' c .]AT_COND_CASE([[canonical LR]], [[ [$end]]])[
[[$default]])[ reduce using rule 3 (S)
-state 11
+State 11
0 $accept: S $end .
$default accept
-state 12
+State 12
4 A: 'a' 'a' .]AT_COND_CASE([[canonical LR]], [[ ['a']]])[
[[$default]])[ reduce using rule 4 (A)
-state 13
+State 13
1 S: 'a' A 'a' .]AT_COND_CASE([[canonical LR]], [[ [$end]]])[
[[$default]])[ reduce using rule 1 (S)
-state 14
+State 14
2 S: 'b' A 'b' .]AT_COND_CASE([[canonical LR]], [[ [$end]]])[
[[$default]])[ reduce using rule 2 (S)
-state 15
+State 15
6 c: 'a' 'b' .]AT_COND_CASE([[canonical LR]], [[ [$end]]])[
[[]], [[
-state 16
+State 16
4 A: 'a' . 'a'
5 | 'a' . ['b']
[[$default]])[ reduce using rule 5 (A)]AT_COND_CASE([[canonical LR]], [[
-state 17
+State 17
4 A: 'a' 'a' . [$end]
$end reduce using rule 4 (A)
-state 18
+State 18
4 A: 'a' 'a' . ['b']
[],
dnl TABLES
-[[state 0
+[[State 0
0 $accept: . S $end
1 S: . 'a' A 'a'
S go to state 4
-state 1
+State 1
1 S: 'a' . A 'a'
4 A: . 'a' 'a' 'a'
A go to state 6
-state 2
+State 2
2 S: 'b' . A 'b'
4 A: . 'a' 'a' 'a'
A go to state 7
-state 3
+State 3
3 S: 'c' . c
4 A: . 'a' 'a' 'a'
c go to state 10
-state 4
+State 4
0 $accept: S . $end
$end shift, and go to state 11
-state 5
+State 5
4 A: 'a' . 'a' 'a'
5 | 'a' . 'a'
'a' shift, and go to state 12
-state 6
+State 6
1 S: 'a' A . 'a'
'a' shift, and go to state 13
-state 7
+State 7
2 S: 'b' A . 'b'
'b' shift, and go to state 14
-state 8
+State 8
4 A: 'a' . 'a' 'a'
5 | 'a' . 'a'
'a' shift, and go to state 15
-state 9
+State 9
7 c: A .]AT_COND_CASE([[canonical LR]], [[ [$end]]])[
[[$default]])[ reduce using rule 7 (c)
-state 10
+State 10
3 S: 'c' c .]AT_COND_CASE([[canonical LR]], [[ [$end]]])[
[[$default]])[ reduce using rule 3 (S)
-state 11
+State 11
0 $accept: S $end .
$default accept
-state 12
+State 12
4 A: 'a' 'a' . 'a'
5 | 'a' 'a' . ]AT_COND_CASE([[LALR]], [[['a', 'b']]], [[['a']]])[
Conflict between rule 5 and token 'a' resolved as reduce (%left 'a').
-state 13
+State 13
1 S: 'a' A 'a' .]AT_COND_CASE([[canonical LR]], [[ [$end]]])[
[[$default]])[ reduce using rule 1 (S)
-state 14
+State 14
2 S: 'b' A 'b' .]AT_COND_CASE([[canonical LR]], [[ [$end]]])[
[[$default]])[ reduce using rule 2 (S)
-state 15
+State 15
4 A: 'a' 'a' . 'a'
5 | 'a' 'a' . [$end]
[[$default]])[ reduce using rule 5 (A)
-state 16
+State 16
4 A: 'a' 'a' 'a' .]AT_COND_CASE([[canonical LR]], [[ ['a']]])[
[[$default]])[ reduce using rule 4 (A)
-state 17
+State 17
6 c: 'a' 'a' 'b' .]AT_COND_CASE([[canonical LR]], [[ [$end]]])[
[[]], [[
-state 18
+State 18
4 A: 'a' . 'a' 'a'
5 | 'a' . 'a'
[[19]])[
-state 19]AT_COND_CASE([[canonical LR]], [[
+State 19]AT_COND_CASE([[canonical LR]], [[
4 A: 'a' 'a' 'a' .]AT_COND_CASE([[canonical LR]], [[ [$end]]])[
[[$default]])[ reduce using rule 4 (A)
-state 20]])[
+State 20]])[
4 A: 'a' 'a' . 'a'
5 | 'a' 'a' . ['b']
[[$default]])[ reduce using rule 5 (A)]AT_COND_CASE([[canonical LR]], [[
-state 21
+State 21
4 A: 'a' 'a' 'a' .]AT_COND_CASE([[canonical LR]], [[ ['b']]])[
[],
dnl TABLES
-[[state 0
+[[State 0
0 $accept: . S $end
1 S: . 'a' A 'a'
S go to state 4
-state 1
+State 1
1 S: 'a' . A 'a'
4 A: . 'a' 'a' B
A go to state 6
-state 2
+State 2
2 S: 'b' . A 'b'
4 A: . 'a' 'a' B
A go to state 7
-state 3
+State 3
3 S: 'c' . c
4 A: . 'a' 'a' B
c go to state 10
-state 4
+State 4
0 $accept: S . $end
$end shift, and go to state 11
-state 5
+State 5
4 A: 'a' . 'a' B
'a' shift, and go to state 12
-state 6
+State 6
1 S: 'a' A . 'a'
'a' shift, and go to state 13
-state 7
+State 7
2 S: 'b' A . 'b'
'b' shift, and go to state 14
-state 8
+State 8
4 A: 'a' . 'a' B
7 c: 'a' . 'a' 'b'
'a' shift, and go to state 15
-state 9
+State 9
8 c: A .]AT_COND_CASE([[canonical LR]], [[ [$end]]])[
[[$default]])[ reduce using rule 8 (c)
-state 10
+State 10
3 S: 'c' c .]AT_COND_CASE([[canonical LR]], [[ [$end]]])[
[[$default]])[ reduce using rule 3 (S)
-state 11
+State 11
0 $accept: S $end .
$default accept
-state 12
+State 12
4 A: 'a' 'a' . B
5 B: . 'a'
Conflict between rule 6 and token 'a' resolved as reduce (%left 'a').
-state 13
+State 13
1 S: 'a' A 'a' .]AT_COND_CASE([[canonical LR]], [[ [$end]]])[
[[$default]])[ reduce using rule 1 (S)
-state 14
+State 14
2 S: 'b' A 'b' .]AT_COND_CASE([[canonical LR]], [[ [$end]]])[
[[$default]])[ reduce using rule 2 (S)
-state 15
+State 15
4 A: 'a' 'a' . B
5 B: . 'a'
B go to state ]AT_COND_CASE([[canonical LR]], [[21]], [[17]])[
-state 16
+State 16
5 B: 'a' .]AT_COND_CASE([[canonical LR]], [[ ['a']]])[
[[$default]])[ reduce using rule 5 (B)
-state 17
+State 17
4 A: 'a' 'a' B .]AT_COND_CASE([[canonical LR]], [[ ['a']]])[
[[$default]])[ reduce using rule 4 (A)
-state 18
+State 18
7 c: 'a' 'a' 'b' .]AT_COND_CASE([[canonical LR]], [[ [$end]]])[
[[$default]])[ reduce using rule 7 (c)]AT_COND_CASE([[LALR]], [], [[
-state 19
+State 19
4 A: 'a' . 'a' B
[[20]])[
-state 20]AT_COND_CASE([[canonical LR]], [[
+State 20]AT_COND_CASE([[canonical LR]], [[
5 B: 'a' . [$end]
$end reduce using rule 5 (B)
-state 21
+State 21
4 A: 'a' 'a' B . [$end]
$end reduce using rule 4 (A)
-state 22]])[
+State 22]])[
4 A: 'a' 'a' . B
5 B: . 'a'
B go to state ]AT_COND_CASE([[canonical LR]], [[24
-state 23
+State 23
5 B: 'a' . ['b']
'b' reduce using rule 5 (B)
-state 24
+State 24
4 A: 'a' 'a' B . ['b']
]], [])],
dnl TABLES
-[[state 0
+[[State 0
0 $accept: . S $end
1 S: . 'a' A 'f'
S go to state 4
-state 1
+State 1
1 S: 'a' . A 'f'
2 | 'a' . B
B go to state 7
-state 2
+State 2
3 S: 'b' . A 'f'
4 | 'b' . B 'g'
B go to state 10
-state 3
+State 3
6 S: 'c' . 'c' A 'g'
7 | 'c' . 'c' B
'c' shift, and go to state 11
-state 4
+State 4
0 $accept: S . $end
$end shift, and go to state 12
-state 5
+State 5
8 A: 'd' . 'e'
9 B: 'd' . 'e'
[[20]])[
-state 6
+State 6
1 S: 'a' A . 'f'
'f' shift, and go to state 14
-state 7
+State 7
2 S: 'a' B .]AT_COND_CASE([[canonical LR]], [[ [$end]]])[
[[$default]])[ reduce using rule 2 (S)
-state 8
+State 8
5 S: 'b' 'd' . [$end]
8 A: 'd' . 'e'
[[$default]])[ reduce using rule 5 (S)
-state 9
+State 9
3 S: 'b' A . 'f'
'f' shift, and go to state 15
-state 10
+State 10
4 S: 'b' B . 'g'
'g' shift, and go to state 16
-state 11
+State 11
6 S: 'c' 'c' . A 'g'
7 | 'c' 'c' . B
B go to state 18
-state 12
+State 12
0 $accept: S $end .
$default accept]AT_COND_CASE([[LALR]], [[
-state 13
+State 13
8 A: 'd' 'e' . ['f', 'g']
9 B: 'd' 'e' . [$end, 'g']
$default reduce using rule 8 (A)]], [[
-state 13
+State 13
8 A: 'd' 'e' . ['f']
9 B: 'd' 'e' . ]AT_COND_CASE([[canonical LR]], [[[$end]]], [[['g']]])[
[[$default]])[ reduce using rule 8 (A)]])[
-state 14
+State 14
1 S: 'a' A 'f' .]AT_COND_CASE([[canonical LR]], [[ [$end]]])[
[[$default]])[ reduce using rule 1 (S)
-state 15
+State 15
3 S: 'b' A 'f' .]AT_COND_CASE([[canonical LR]], [[ [$end]]])[
[[$default]])[ reduce using rule 3 (S)
-state 16
+State 16
4 S: 'b' B 'g' .]AT_COND_CASE([[canonical LR]], [[ [$end]]])[
[[$default]])[ reduce using rule 4 (S)
-state 17
+State 17
6 S: 'c' 'c' A . 'g'
'g' shift, and go to state 19
-state 18
+State 18
7 S: 'c' 'c' B .]AT_COND_CASE([[canonical LR]], [[ [$end]]])[
[[$default]])[ reduce using rule 7 (S)
-state 19
+State 19
6 S: 'c' 'c' A 'g' .]AT_COND_CASE([[canonical LR]], [[ [$end]]])[
[[]], [[
-state 20]AT_COND_CASE([[canonical LR]], [[
+State 20]AT_COND_CASE([[canonical LR]], [[
8 A: 'd' 'e' . ['f']
9 B: 'd' 'e' . ['g']
'g' reduce using rule 9 (B)
-state 21
+State 21
8 A: 'd' . 'e'
9 B: 'd' . 'e'
'e' shift, and go to state 22
-state 22
+State 22
8 A: 'd' 'e' . ['g']
9 B: 'd' 'e' . [$end]
m4_define([AT_TEST_LR_DEFAULT_REDUCTIONS],
[
AT_TEST_TABLES_AND_PARSE([[no %define lr.default-reductions]],
- [[all]], [[]],
+ [[most]], [[]],
[[]],
[$1], [$2], [[]], [$3])
-AT_TEST_TABLES_AND_PARSE([[%define lr.default-reductions "all"]],
- [[all]], [[]],
- [[%define lr.default-reductions "all"]],
+AT_TEST_TABLES_AND_PARSE([[%define lr.default-reductions most]],
+ [[most]], [[]],
+ [[%define lr.default-reductions most]],
[$1], [$2], [[]], [$3])
-AT_TEST_TABLES_AND_PARSE([[%define lr.default-reductions "consistent"]],
+AT_TEST_TABLES_AND_PARSE([[%define lr.default-reductions consistent]],
[[consistent]], [[]],
- [[%define lr.default-reductions "consistent"]],
+ [[%define lr.default-reductions consistent]],
[$1], [$2], [[]], [$3])
-AT_TEST_TABLES_AND_PARSE([[%define lr.default-reductions "accepting"]],
+AT_TEST_TABLES_AND_PARSE([[%define lr.default-reductions accepting]],
[[accepting]], [[]],
- [[%define lr.default-reductions "accepting"]],
+ [[%define lr.default-reductions accepting]],
[$1], [$2], [[]], [$3])
])
]],
dnl Visit each state mentioned above.
[['a', 'a']],
-[[state 0
+[[State 0
0 $accept: . start $end
1 start: . a b
a go to state 3
-state 1
+State 1
4 a: 'a' .]AT_COND_CASE([[accepting]], [[ [$end, 'a', 'b']
$default reduce using rule 4 (a)]])[
-state 2
+State 2
0 $accept: start . $end
$end shift, and go to state 4
-state 3
+State 3
1 start: a . b
2 | a . b 'a'
3 | a . c 'b'
5 b: . [$end, 'a']
- 6 c: . ['b']]AT_COND_CASE([[all]], [[
+ 6 c: . ['b']]AT_COND_CASE([[most]], [[
'b' reduce using rule 6 (c)
$default reduce using rule 5 (b)]], [[
c go to state 6
-state 4
+State 4
0 $accept: start $end .
$default accept
-state 5
+State 5
1 start: a b . [$end]
2 | a b . 'a'
'a' shift, and go to state 7
- ]AT_COND_CASE([[all]], [[$default]], [[$end]])[ reduce using rule 1 (start)
+ ]AT_COND_CASE([[most]], [[$default]],
+ [[$end]])[ reduce using rule 1 (start)
-state 6
+State 6
3 start: a c . 'b'
'b' shift, and go to state 8
-state 7
+State 7
2 start: a b 'a' .]AT_COND_CASE([[accepting]], [[ [$end]
$default reduce using rule 2 (start)]])[
-state 8
+State 8
3 start: a c 'b' .]AT_COND_CASE([[accepting]], [[ [$end]