# Exercising Bison Grammar Reduction. -*- Autotest -*-
-# Copyright (C) 2001-2002, 2007-2012 Free Software Foundation, Inc.
+# Copyright (C) 2001-2002, 2007-2013 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([[input.y]], 0, [],
+AT_BISON_CHECK([[-fcaret input.y]], 0, [],
[[input.y: warning: 9 nonterminals useless in grammar [-Wother]
input.y: warning: 9 rules useless in grammar [-Wother]
input.y:6.1-8: warning: nonterminal useless in grammar: useless1 [-Wother]
+ useless1: '1';
+ ^^^^^^^^
input.y:7.1-8: warning: nonterminal useless in grammar: useless2 [-Wother]
+ useless2: '2';
+ ^^^^^^^^
input.y:8.1-8: warning: nonterminal useless in grammar: useless3 [-Wother]
+ useless3: '3';
+ ^^^^^^^^
input.y:9.1-8: warning: nonterminal useless in grammar: useless4 [-Wother]
+ useless4: '4';
+ ^^^^^^^^
input.y:10.1-8: warning: nonterminal useless in grammar: useless5 [-Wother]
+ useless5: '5';
+ ^^^^^^^^
input.y:11.1-8: warning: nonterminal useless in grammar: useless6 [-Wother]
+ useless6: '6';
+ ^^^^^^^^
input.y:12.1-8: warning: nonterminal useless in grammar: useless7 [-Wother]
+ useless7: '7';
+ ^^^^^^^^
input.y:13.1-8: warning: nonterminal useless in grammar: useless8 [-Wother]
+ useless8: '8';
+ ^^^^^^^^
input.y:14.1-8: warning: nonterminal useless in grammar: useless9 [-Wother]
-input.y:6.11-13: warning: rule useless in grammar: useless1: '1' [-Wother]
-input.y:7.11-13: warning: rule useless in grammar: useless2: '2' [-Wother]
-input.y:8.11-13: warning: rule useless in grammar: useless3: '3' [-Wother]
-input.y:9.11-13: warning: rule useless in grammar: useless4: '4' [-Wother]
-input.y:10.11-13: warning: rule useless in grammar: useless5: '5' [-Wother]
-input.y:11.11-13: warning: rule useless in grammar: useless6: '6' [-Wother]
-input.y:12.11-13: warning: rule useless in grammar: useless7: '7' [-Wother]
-input.y:13.11-13: warning: rule useless in grammar: useless8: '8' [-Wother]
-input.y:14.11-13: warning: rule useless in grammar: useless9: '9' [-Wother]
+ useless9: '9';
+ ^^^^^^^^
+input.y:6.11-13: warning: rule useless in grammar [-Wother]
+ useless1: '1';
+ ^^^
+input.y:7.11-13: warning: rule useless in grammar [-Wother]
+ useless2: '2';
+ ^^^
+input.y:8.11-13: warning: rule useless in grammar [-Wother]
+ useless3: '3';
+ ^^^
+input.y:9.11-13: warning: rule useless in grammar [-Wother]
+ useless4: '4';
+ ^^^
+input.y:10.11-13: warning: rule useless in grammar [-Wother]
+ useless5: '5';
+ ^^^
+input.y:11.11-13: warning: rule useless in grammar [-Wother]
+ useless6: '6';
+ ^^^
+input.y:12.11-13: warning: rule useless in grammar [-Wother]
+ useless7: '7';
+ ^^^
+input.y:13.11-13: warning: rule useless in grammar [-Wother]
+ useless8: '8';
+ ^^^
+input.y:14.11-13: warning: rule useless in grammar [-Wother]
+ useless9: '9';
+ ^^^
]])
+
AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' input.output]], 0,
[[Nonterminals useless in grammar
useless1
%%
]])
-AT_BISON_CHECK([[not-reduced.y]], 0, [],
+AT_BISON_CHECK([[-fcaret not-reduced.y]], 0, [],
[[not-reduced.y: warning: 2 nonterminals useless in grammar [-Wother]
not-reduced.y: warning: 3 rules useless in grammar [-Wother]
not-reduced.y:14.1-13: warning: nonterminal useless in grammar: not_reachable [-Wother]
+ not_reachable: useful { /* A not reachable action. */ }
+ ^^^^^^^^^^^^^
not-reduced.y:11.6-19: warning: nonterminal useless in grammar: non_productive [-Wother]
-not-reduced.y:11.6-57: warning: rule useless in grammar: exp: non_productive [-Wother]
-not-reduced.y:14.16-56: warning: rule useless in grammar: not_reachable: useful [-Wother]
-not-reduced.y:17.17-18.63: warning: rule useless in grammar: non_productive: non_productive useless_token [-Wother]
+ | non_productive { /* A non productive action. */ }
+ ^^^^^^^^^^^^^^
+not-reduced.y:11.6-57: warning: rule useless in grammar [-Wother]
+ | non_productive { /* A non productive action. */ }
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+not-reduced.y:14.16-56: warning: rule useless in grammar [-Wother]
+ not_reachable: useful { /* A not reachable action. */ }
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+not-reduced.y:17.17-18.63: warning: rule useless in grammar [-Wother]
+ non_productive: non_productive useless_token
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
]])
AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' not-reduced.output]], 0,
input.y: warning: 3 rules useless in grammar [-Wother]
input.y:5.15-25: warning: nonterminal useless in grammar: underivable [-Wother]
input.y:6.14-24: warning: nonterminal useless in grammar: indirection [-Wother]
-input.y:5.15-25: warning: rule useless in grammar: exp: underivable [-Wother]
-input.y:6.14-24: warning: rule useless in grammar: underivable: indirection [-Wother]
-input.y:7.14-24: warning: rule useless in grammar: indirection: underivable [-Wother]
+input.y:5.15-25: warning: rule useless in grammar [-Wother]
+input.y:6.14-24: warning: rule useless in grammar [-Wother]
+input.y:7.14-24: warning: rule useless in grammar [-Wother]
]])
AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' input.output]], 0,
[[%left 'a'
// Conflict resolution renders state 12 unreachable for canonical LR(1). We
// keep it so that the paser table diff is easier to code.
-%define lr.keep-unreachable-states]],
+%define lr.keep-unreachable-state]],
[[
S: 'a' A 'a' /* rule 1 */
| 'b' A 'b' /* rule 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']
[[%left 'a'
// Conflict resolution renders state 16 unreachable for canonical LR(1). We
// keep it so that the paser table diff is easier to code.
-%define lr.keep-unreachable-states]],
+%define lr.keep-unreachable-state]],
[[
/* Similar to the last test case set but two states must be split. */
S: 'a' A 'a' /* rule 1 */
[],
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']]])[
[[%left 'a'
// Conflict resolution renders state 16 unreachable for canonical LR(1). We
// keep it so that the paser table diff is easier to code.
-%define lr.keep-unreachable-states]],
+%define lr.keep-unreachable-state]],
[[
/* Similar to the last test case set but forseeing the S/R conflict from the
first state that must be split is becoming difficult. Imagine if B were
[],
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']
]])])
AT_TEST_LR_TYPE([[Split During Added Lookahead Propagation]],
-[[%define lr.keep-unreachable-states]],
+[[%define lr.keep-unreachable-state]],
[[
/* The partial state chart diagram below is for LALR(1). State 0 is the start
state. States are iterated for successor construction in numerical order.
dnl BISON-STDERR
[AT_COND_CASE([[LALR]],
-[[input.y: conflicts: 1 reduce/reduce
+[[input.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr]
]], [])],
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]
## ------------------------------- ##
-## %define lr.default-reductions. ##
+## %define lr.default-reduction. ##
## ------------------------------- ##
# AT_TEST_LR_DEFAULT_REDUCTIONS(GRAMMAR, INPUT, TABLES)
# -----------------------------------------------------
m4_define([AT_TEST_LR_DEFAULT_REDUCTIONS],
[
-AT_TEST_TABLES_AND_PARSE([[no %define lr.default-reductions]],
+AT_TEST_TABLES_AND_PARSE([[no %define lr.default-reduction]],
[[most]], [[]],
[[]],
[$1], [$2], [[]], [$3])
-AT_TEST_TABLES_AND_PARSE([[%define lr.default-reductions most]],
+AT_TEST_TABLES_AND_PARSE([[%define lr.default-reduction most]],
[[most]], [[]],
- [[%define lr.default-reductions most]],
+ [[%define lr.default-reduction most]],
[$1], [$2], [[]], [$3])
-AT_TEST_TABLES_AND_PARSE([[%define lr.default-reductions consistent]],
+AT_TEST_TABLES_AND_PARSE([[%define lr.default-reduction consistent]],
[[consistent]], [[]],
- [[%define lr.default-reductions consistent]],
+ [[%define lr.default-reduction consistent]],
[$1], [$2], [[]], [$3])
-AT_TEST_TABLES_AND_PARSE([[%define lr.default-reductions accepting]],
+AT_TEST_TABLES_AND_PARSE([[%define lr.default-reduction accepting]],
[[accepting]], [[]],
- [[%define lr.default-reductions accepting]],
+ [[%define lr.default-reduction 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'
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'
[[$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]