mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-09 12:23:04 +00:00
is reached by eoftoken. (insert_start_shifting_state, insert_eof_shifting_state) (insert_accepting_state, augment_automaton): Remove, since now these states are automatically computed from the initial state. (generate_states): Adjust. * src/print.c: When reporting a rule number to the user, substract 1, so that the axiom rule is rule 0, and the first user rule is 1. * src/reduce.c: Likewise. * src/print_graph.c (print_core): For the time being, just as for the report, depend upon --trace-flags to dump the full set of items. * src/reader.c (readgram): Once the grammar read, insert the rule 0: `$axiom: START-SYMBOL $'. * tests/set.at: Adjust: rule 0 is now displayed, and since the number of the states has changed (the final state is no longer necessarily the last), catch up.
239 lines
3.9 KiB
Plaintext
239 lines
3.9 KiB
Plaintext
# 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]], [], [], [stderr])
|
|
|
|
AT_CHECK([[sed 's/[ ]*$//' stderr]], [],
|
|
[[RITEM
|
|
e $ (rule 1)
|
|
'e' (rule 2)
|
|
(rule 3)
|
|
|
|
|
|
DERIVES
|
|
$axiom derives
|
|
1: e (rule 0)
|
|
e derives
|
|
2: 'e' (rule 2)
|
|
3: (rule 3)
|
|
|
|
|
|
Entering set_nullable
|
|
NULLABLE
|
|
$axiom: yes
|
|
e: yes
|
|
|
|
|
|
TC: Input BEGIN
|
|
|
|
01
|
|
.--.
|
|
0| 1|
|
|
1| |
|
|
`--'
|
|
TC: Input END
|
|
|
|
TC: Output BEGIN
|
|
|
|
01
|
|
.--.
|
|
0| 1|
|
|
1| |
|
|
`--'
|
|
TC: Output END
|
|
|
|
FIRSTS
|
|
$axiom firsts
|
|
4 ($axiom)
|
|
5 (e)
|
|
e firsts
|
|
5 (e)
|
|
|
|
|
|
FDERIVES
|
|
$axiom derives
|
|
1: e $
|
|
2: 'e'
|
|
3:
|
|
e derives
|
|
2: 'e'
|
|
3:
|
|
|
|
|
|
Processing state 0 (reached by $)
|
|
Closure: input
|
|
|
|
|
|
Closure: output
|
|
0: . e $ (rule 1)
|
|
3: . 'e' (rule 2)
|
|
5: . (rule 3)
|
|
|
|
|
|
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
|
|
Entering get_state, state = 0, symbol = 5 (e)
|
|
Entering new_state, state = 0, symbol = 5 (e)
|
|
Exiting get_state => 2
|
|
Processing state 1 (reached by 'e')
|
|
Closure: input
|
|
4: . (rule 2)
|
|
|
|
|
|
Closure: output
|
|
4: . (rule 2)
|
|
|
|
|
|
Entering new_itemsets, state = 1
|
|
Entering append_states, state = 1
|
|
Processing state 2 (reached by e)
|
|
Closure: input
|
|
1: . $ (rule 1)
|
|
|
|
|
|
Closure: output
|
|
1: . $ (rule 1)
|
|
|
|
|
|
Entering new_itemsets, state = 2
|
|
Entering append_states, state = 2
|
|
Entering get_state, state = 2, symbol = 0 ($)
|
|
Entering new_state, state = 2, symbol = 0 ($)
|
|
Exiting get_state => 3
|
|
Processing state 3 (reached by $)
|
|
Closure: input
|
|
2: . (rule 1)
|
|
|
|
|
|
Closure: output
|
|
2: . (rule 1)
|
|
|
|
|
|
Entering new_itemsets, state = 3
|
|
Entering append_states, state = 3
|
|
transpose: input
|
|
0:
|
|
|
|
transpose: output
|
|
0:
|
|
|
|
]])
|
|
|
|
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]], [], [], [stderr])
|
|
|
|
AT_CHECK([[sed -n 's/[ ]*$//;/^TC: Output BEGIN/,/^TC: Output END/p' stderr]], [],
|
|
[[TC: Output BEGIN
|
|
|
|
012345678
|
|
.---------.
|
|
0| 11111111|
|
|
1| 1111111|
|
|
2| 111111|
|
|
3| 11111|
|
|
4| 1111|
|
|
5| 111|
|
|
6| 11|
|
|
7| 1|
|
|
8| |
|
|
`---------'
|
|
TC: Output END
|
|
]])
|
|
|
|
AT_CLEANUP
|