mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-14 14:53:03 +00:00
* src/gram.h, src/gram.c (rules_rhs_length): New.
(ritem_longest_rhs): Use it. * src/gram.h (rule_t): `number' is a new member. * src/reader.c (packgram): Set it. * src/reduce.c (reduce_grammar_tables): Move the useless rules at the end of `rules', and count them out of `nrules'. (reduce_output, dump_grammar): Adjust. * src/print.c (print_grammar): It is no longer needed to check for the usefulness of a rule, as useless rules are beyond `nrules + 1'. * tests/reduce.at (Reduced Automaton): New test.
This commit is contained in:
@@ -173,6 +173,89 @@ AT_CLEANUP
|
||||
|
||||
|
||||
|
||||
## ------------------- ##
|
||||
## Reduced Automaton. ##
|
||||
## ------------------- ##
|
||||
|
||||
# Check that the automaton is that as the for the grammar reduced by
|
||||
# hand.
|
||||
|
||||
AT_SETUP([Reduced Automaton])
|
||||
|
||||
# The non reduced grammar.
|
||||
# ------------------------
|
||||
AT_DATA([[not-reduced.y]],
|
||||
[[/* A useless token. */
|
||||
%token useless_token
|
||||
/* A useful one. */
|
||||
%token useful
|
||||
%verbose
|
||||
%output="not-reduced.c"
|
||||
|
||||
%%
|
||||
|
||||
exp: useful { /* A useful action. */ }
|
||||
| non_productive { /* A non productive action. */ }
|
||||
;
|
||||
|
||||
not_reachable: useful { /* A not reachable action. */ }
|
||||
;
|
||||
|
||||
non_productive: non_productive useless_token
|
||||
{ /* Another non productive action. */ }
|
||||
;
|
||||
]])
|
||||
|
||||
AT_CHECK([[bison not-reduced.y]], 0, [],
|
||||
[[not-reduced.y contains 2 useless nonterminals and 3 useless rules
|
||||
]])
|
||||
|
||||
AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' not-reduced.output]], 0,
|
||||
[[Useless nonterminals:
|
||||
not_reachable
|
||||
non_productive
|
||||
Terminals which are not used:
|
||||
useless_token
|
||||
Useless rules:
|
||||
#2 exp: non_productive;
|
||||
#3 not_reachable: useful;
|
||||
#4 non_productive: non_productive useless_token;
|
||||
]])
|
||||
|
||||
# The reduced grammar.
|
||||
# --------------------
|
||||
AT_DATA([[reduced.y]],
|
||||
[[/* A useless token. */
|
||||
%token useless_token
|
||||
/* A useful one. */
|
||||
%token useful
|
||||
%verbose
|
||||
%output="reduced.c"
|
||||
|
||||
%%
|
||||
|
||||
exp: useful { /* A useful action. */ }
|
||||
// | non_productive { /* A non productive action. */ } */
|
||||
;
|
||||
|
||||
//not_reachable: useful { /* A not reachable action. */ }
|
||||
// ;
|
||||
|
||||
//non_productive: non_productive useless_token
|
||||
// { /* Another non productive action. */ }
|
||||
// ;
|
||||
]])
|
||||
|
||||
AT_CHECK([[bison reduced.y]])
|
||||
|
||||
# Comparing the parsers.
|
||||
cp reduced.c expout
|
||||
AT_CHECK([sed 's/not-reduced/reduced/g' not-reduced.c], 0, [expout])
|
||||
|
||||
AT_CLEANUP
|
||||
|
||||
|
||||
|
||||
## ------------------- ##
|
||||
## Underivable Rules. ##
|
||||
## ------------------- ##
|
||||
|
||||
Reference in New Issue
Block a user