# Exercising Bison Grammar Sets.                      -*- Autotest -*-
# Copyright 2001 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
# the Free Software Foundation; either version 2, or (at your option)
# any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.

# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
# 02111-1307, USA.

AT_BANNER([[Grammar Sets (Firsts etc.).]])


## ---------- ##
## Nullable.  ##
## ---------- ##

AT_SETUP([Nullable])

# At some point, nullable had been smoking grass, and managed to say:
#
# Entering set_nullable
# NULLABLE
#         'e': yes
#         (null): no
# ...

AT_DATA([[input.y]],
[[%%
e: 'e' | /* Nothing */;
]])

AT_CHECK([[bison --trace input.y]], [], [],
[[RITEM
  'e'  (rule 1)
  (rule 2)


DERIVES
	e derives
		1: 'e' (rule 1)
		2: (rule 2)


Entering set_nullable
NULLABLE
	e: yes


TC: Input BEGIN
    @&t@
   0
  .-.
 0| |
  `-'
TC: Input END

TC: Output BEGIN
    @&t@
   0
  .-.
 0| |
  `-'
TC: Output END

FIRSTS
	e firsts
		4 (e)


FDERIVES
	e derives
		1: 'e'
		2:


Processing state 0 (reached by $)
Closure: input


Closure: output
   0: . 'e'  (rule 1)
   2: .  (rule 2)


Entering new_itemsets, state = 0
Entering append_states, state = 0
Entering get_state, state = 0, symbol = 3 ('e')
Entering new_state, state = 0, symbol = 3 ('e')
Exiting get_state => 1
Processing state 1 (reached by 'e')
Closure: input
   1: .  (rule 1)


Closure: output
   1: .  (rule 1)


Entering new_itemsets, state = 1
Entering append_states, state = 1
transpose: input
  0: @&t@

transpose: output
  0: @&t@

]])

AT_CLEANUP


## ---------------- ##
## Broken Closure.  ##
## ---------------- ##

# TC was once broken during a massive `simplification' of the code.
# It resulted in bison dumping core on the following grammar (the
# computation of FIRSTS uses TC).  It managed to produce a pretty
# exotic closure:
#
# TC: Input
#
#    01234567
#   +--------+
#  0| 1      |
#  1|  1     |
#  2|   1    |
#  3|    1   |
#  4|     1  |
#  5|      1 |
#  6|       1|
#  7|        |
#   +--------+
#
# TC: Output
#
#    01234567
#   +--------+
#  0| 1      |
#  1| 111    |
#  2| 111    |
#  3| 1111   |
#  4| 111 1  |
#  5| 111  1 |
#  6| 111   1|
#  7| 111    |
#   +--------+
#
# instead of that below.

AT_SETUP([Broken Closure])

AT_DATA([input.y],
[[%%
a: b;
b: c;
c: d;
d: e;
e: f;
f: g;
g: h;
h: 'h';
]])

AT_CHECK([bison --trace input.y 2>&1 |
          sed -n '/^TC: Output BEGIN/,/^TC: Output END/p'],
         [0],
[[TC: Output BEGIN
           @&t@
   01234567
  .--------.
 0| 1111111|
 1|  111111|
 2|   11111|
 3|    1111|
 4|     111|
 5|      11|
 6|       1|
 7|        |
  `--------'
TC: Output END
]])

AT_CLEANUP
