mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-08-14 05:05:14 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3f66ed1c8b | ||
|
|
58dce15432 | ||
|
|
e6970f2ed0 | ||
|
|
b9866ce4da | ||
|
|
b32ba448c8 | ||
|
|
5844cd0cfa | ||
|
|
0fc1a97d9f | ||
|
|
84b6f48351 | ||
|
|
b6a70d99a6 | ||
|
|
66d35de779 | ||
|
|
5e5b240715 | ||
|
|
aaf7be2c4b | ||
|
|
0ea80316a9 | ||
|
|
09b2117db7 | ||
|
|
78fc5ce865 | ||
|
|
766ffc1523 | ||
|
|
06a2f464b1 | ||
|
|
15ab9127f5 | ||
|
|
32f18df511 | ||
|
|
19f8d30b9c | ||
|
|
7b106ce5f0 | ||
|
|
b5c15946a1 | ||
|
|
980929ba0b | ||
|
|
4c3791f08d | ||
|
|
a8355549a5 | ||
|
|
2883204382 | ||
|
|
825b9e4ef4 | ||
|
|
57339f0421 | ||
|
|
963c0cf62f | ||
|
|
6a1e01f060 | ||
|
|
4cecb5a248 | ||
|
|
76c97f6a39 | ||
|
|
e4ef7aa1c9 | ||
|
|
3557477440 | ||
|
|
4b412c9eca | ||
|
|
fa7f94f217 | ||
|
|
d854cc9e5a | ||
|
|
2dfb4daf9b | ||
|
|
cc904af579 | ||
|
|
716c50b877 | ||
|
|
9f41bcaae8 | ||
|
|
1ccbf4bb8b | ||
|
|
a69f6fa569 | ||
|
|
3757d84e90 | ||
|
|
cac4f75e15 | ||
|
|
fc7ddd2818 | ||
|
|
0ffdf37212 | ||
|
|
9e55edfc29 | ||
|
|
d39a6b7ca9 | ||
|
|
d287d66a69 | ||
|
|
ea451a17d7 | ||
|
|
24b1e65f04 | ||
|
|
7ad28769d6 | ||
|
|
57d4ee2b82 | ||
|
|
d8a9ec00b8 | ||
|
|
872e1b86c4 | ||
|
|
ad4c2c7a57 | ||
|
|
0785dec2c8 | ||
|
|
e1828f4f07 | ||
|
|
a816bf3eac | ||
|
|
2ce6476804 | ||
|
|
457b6d1e72 | ||
|
|
79ebbdb36a | ||
|
|
0aa2ac9063 | ||
|
|
e7d79012ae | ||
|
|
eb4a4d73bc | ||
|
|
dee96b5a07 | ||
|
|
4bfeeafb00 | ||
|
|
c18cf8cb26 | ||
|
|
54b982ae70 | ||
|
|
cf2e198269 | ||
|
|
af4483a0ab | ||
|
|
674fd9acbc | ||
|
|
6fedd4d1d6 | ||
|
|
abe1baa044 | ||
|
|
33285af04d | ||
|
|
cd7f95831e | ||
|
|
1b9a8440cd | ||
|
|
aead559e00 | ||
|
|
92b69b7f09 | ||
|
|
6e303f08d6 | ||
|
|
3dfc01e247 | ||
|
|
1503820f54 | ||
|
|
bc9bb28004 | ||
|
|
16c4a35041 | ||
|
|
f0451dba71 | ||
|
|
a9f37dee0c | ||
|
|
4b0979fcf3 | ||
|
|
cc35239e1b | ||
|
|
2e2cbb3fad | ||
|
|
adb4edee47 | ||
|
|
65490badba | ||
|
|
8b044b8540 | ||
|
|
0704bc9b8e | ||
|
|
2b7c2ef124 | ||
|
|
48e38d301e | ||
|
|
560757768c | ||
|
|
238b8134ec | ||
|
|
483642486d | ||
|
|
146ad4c8d0 | ||
|
|
f2a4c94506 | ||
|
|
65fae038b9 | ||
|
|
e1cb5fb523 | ||
|
|
64fabbb49f | ||
|
|
3b2925a060 | ||
|
|
83bcf86639 | ||
|
|
8639df64a6 | ||
|
|
377bd7c9a2 | ||
|
|
b4a7a230f1 | ||
|
|
c1586e58fe | ||
|
|
50766eee39 | ||
|
|
dc3b81cd67 | ||
|
|
c555896775 | ||
|
|
35f61cb998 | ||
|
|
9291f914de | ||
|
|
ff1581dddb | ||
|
|
4b9170b2c0 | ||
|
|
523a9eafdc | ||
|
|
bcdf932ed9 | ||
|
|
e2aabb3dc6 | ||
|
|
e8ebe4b0c7 | ||
|
|
9043475828 | ||
|
|
d80a86e0b5 | ||
|
|
cfc3acf242 | ||
|
|
93337ac41c | ||
|
|
0d7803637b | ||
|
|
a62c863ec3 | ||
|
|
1e883de90c | ||
|
|
efcff8cd5c | ||
|
|
3e85a00236 | ||
|
|
f85c981ac1 | ||
|
|
5cb10dae3c | ||
|
|
26e1ca45ba | ||
|
|
8888e43b2c | ||
|
|
d9ca2df2aa | ||
|
|
e8def3ff6e | ||
|
|
76e734e5ed | ||
|
|
b8b4a730a0 | ||
|
|
b9d2d2a881 | ||
|
|
78986eff74 | ||
|
|
1393a78454 | ||
|
|
de11686376 | ||
|
|
badfc69c26 | ||
|
|
fb28699f95 | ||
|
|
6b307af66c | ||
|
|
dad56b10d3 | ||
|
|
5f1ff7cd74 | ||
|
|
b6cac93afa | ||
|
|
86d5a1ed5c | ||
|
|
97e9ee3ad5 | ||
|
|
d81e5db73f | ||
|
|
029806c785 | ||
|
|
a2874a4e5d | ||
|
|
d54387b4bc | ||
|
|
a4c22fa4bf | ||
|
|
0d214b93b0 | ||
|
|
3c5d71ca8b | ||
|
|
d61c57b70c | ||
|
|
ea57e0a3c4 | ||
|
|
57c429f305 | ||
|
|
239e5c1a9a | ||
|
|
ae9b5e5a4f | ||
|
|
7ae1c5929e | ||
|
|
1d708336d4 | ||
|
|
705131d1de | ||
|
|
5c2a5a8970 | ||
|
|
6b784f8552 | ||
|
|
32a1edfccd | ||
|
|
63cf44e7ac | ||
|
|
9507085cf3 | ||
|
|
8d3c8c3643 | ||
|
|
16c9da79ef | ||
|
|
d0132d6bec | ||
|
|
1306676ce3 | ||
|
|
e18cda8b5e |
@@ -1,3 +1,942 @@
|
|||||||
|
2001-12-05 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
Version 1.30f.
|
||||||
|
|
||||||
|
2001-12-05 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* tests/atlocal.in (CPPFLAGS): Do not leave a space between -I and
|
||||||
|
its argument.
|
||||||
|
Reported by Peter Hámorský.
|
||||||
|
|
||||||
|
2001-12-05 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/conflicts.c (err_table): Remove.
|
||||||
|
(resolve_sr_conflict): Adjust.
|
||||||
|
* src/lalr.h (state_t.reduction_table, state_t.shift_table):
|
||||||
|
Rename as...
|
||||||
|
(state_t.reductions, state_t.shifts): this.
|
||||||
|
|
||||||
|
2001-12-05 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/reduce.c (reduce_grammar_tables): No longer disable the
|
||||||
|
removal of useless rules via CPP but via `if (0)', so that the
|
||||||
|
compiler still check the code is valid.
|
||||||
|
For instance, it should have noticed `rline' no longer exists: use
|
||||||
|
the `line' member of rule_t.
|
||||||
|
* src/gram.c (dummy, rline): Remove, unused.
|
||||||
|
|
||||||
|
2001-12-05 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/output.c (pack_vector): Use assert, not berror.
|
||||||
|
* src/main.c (berror): Remove, unused.
|
||||||
|
|
||||||
|
2001-12-05 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
New experimental feature: if --verbose --trace output all the
|
||||||
|
items of a state, not only its kernel.
|
||||||
|
|
||||||
|
* src/print.c (print_core): If `trace_flag', then invoke closure
|
||||||
|
before outputting the items of the state (print_core is no longer
|
||||||
|
a correct name them).
|
||||||
|
(print_results): Invoke new_closure/free_closure if needed.
|
||||||
|
|
||||||
|
2001-12-05 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/LR0.c (new_itemsets): Use nshifts only, not shiftcount.
|
||||||
|
* src/closure.c, src/closure.h (itemsetsize): Rename as...
|
||||||
|
(nitemset): for consistency with the rest of the project.
|
||||||
|
|
||||||
|
2001-12-05 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/closure.c (print_closure): Improve.
|
||||||
|
(closure): Use it for printing input and output.
|
||||||
|
|
||||||
|
2001-12-05 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/closure.c (FIRSTS, FDERIVES): Adjust to reality: they are
|
||||||
|
indexed by nonterminals.
|
||||||
|
|
||||||
|
2001-12-05 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/warshall.c (TC, RTC): De-obsfucate (source reduced to 22% of
|
||||||
|
what it was!).
|
||||||
|
* src/warshall.h: Remove accidental duplication of the content.
|
||||||
|
|
||||||
|
2001-12-05 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/closure.c (set_fderives): De-obfuscate.
|
||||||
|
|
||||||
|
2001-12-05 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/closure.c (print_firsts, print_fderives): De-obfuscate.
|
||||||
|
|
||||||
|
2001-12-05 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/closure.c (set_firsts): De-obfuscate.
|
||||||
|
|
||||||
|
2001-12-05 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/output.c (action_row): De-obfuscate
|
||||||
|
using the good o' techniques: arrays not pointers, variable
|
||||||
|
locality, BITISSET, RESETBIT etc.
|
||||||
|
|
||||||
|
2001-12-05 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
Pessimize the code to simplify it: from now on, all the states
|
||||||
|
have a valid SHIFTS, which NSHIFTS is possibly 0.
|
||||||
|
|
||||||
|
* src/LR0.c (shifts_new): Be global and move to..
|
||||||
|
* src/state.c, src/state.h: here.
|
||||||
|
* src/conflicts, src/lalr.c, src/output.c, src/print.c,
|
||||||
|
* src/print_graph: Adjust.
|
||||||
|
|
||||||
|
2001-12-05 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/state.h (SHIFT_DISABLE, SHIFT_IS_DISABLED): New.
|
||||||
|
* src/conflicts.c: Use it.
|
||||||
|
Restore a few missing `if (!SHIFT_IS_DISABLED)' which were
|
||||||
|
incorrectly ``simplified''.
|
||||||
|
|
||||||
|
2001-12-05 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/conflicts.c (flush_shift, resolve_sr_conflict): De-obfuscate
|
||||||
|
using the good o' techniques: arrays not pointers, variable
|
||||||
|
locality, BITISSET, RESETBIT etc.
|
||||||
|
|
||||||
|
2001-12-05 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/state.h (SHIFT_SYMBOL): New.
|
||||||
|
* src/conflicts.c: Use it to deobfuscate.
|
||||||
|
|
||||||
|
2001-12-05 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/conflicts.c (count_sr_conflicts, count_rr_conflicts)
|
||||||
|
(print_reductions): De-obfuscate using the good o' techniques:
|
||||||
|
arrays not pointers, variable locality, BITISSET.
|
||||||
|
|
||||||
|
2001-12-05 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/conflicts.c (print_reductions): Arrays, not pointers.
|
||||||
|
Use BITISSET.
|
||||||
|
|
||||||
|
2001-12-05 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/conflicts.c (print_reductions): Pessimize, but clarify.
|
||||||
|
|
||||||
|
2001-12-05 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/conflicts.c (print_reductions): Improve variable locality.
|
||||||
|
|
||||||
|
2001-12-05 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/conflicts.c (print_reductions): Pessimize, but clarify.
|
||||||
|
|
||||||
|
2001-12-05 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/conflicts.c (print_reductions): Improve variable locality.
|
||||||
|
|
||||||
|
2001-12-05 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/state.h (SHIFT_IS_ERROR, SHIFT_IS_GOTO, SHIFT_IS_SHIFT): New.
|
||||||
|
* src/lalr.c: Use them.
|
||||||
|
|
||||||
|
2001-12-05 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/LR0.c (augment_automaton): Formatting changes.
|
||||||
|
Better variable locality.
|
||||||
|
|
||||||
|
2001-12-05 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/lalr.c (matrix_print): New.
|
||||||
|
(transpose): Use it.
|
||||||
|
Use arrays instead of pointers.
|
||||||
|
|
||||||
|
2001-12-05 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/lalr.c (maxrhs): Move to...
|
||||||
|
* src/gram.c, src/gram.h (ritem_longest_rhs): here.
|
||||||
|
* src/lalr.c (build_relations): Adjust.
|
||||||
|
|
||||||
|
2001-12-05 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/lalr.c (transpose): Free the memory allocated to the
|
||||||
|
argument, as it is replaced by the results by the unique caller.
|
||||||
|
(build_relations): Merely invoke transpose: it handles the memory
|
||||||
|
deallocation.
|
||||||
|
Improve variable locality.
|
||||||
|
Avoid variables used as mere abbreviations.
|
||||||
|
(compute_lookaheads): Use arrays instead of pointers.
|
||||||
|
|
||||||
|
2001-12-05 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/lalr.c (initialize_F): Improve variable locality.
|
||||||
|
Avoid variables used as mere abbreviations.
|
||||||
|
|
||||||
|
2001-12-05 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/derives.c (print_derives): Display the ruleno.
|
||||||
|
* src/lalr.c (initialize_F, transpose): Better variable locality
|
||||||
|
to improve readability.
|
||||||
|
Avoid variables used as mere abbreviations.
|
||||||
|
|
||||||
|
2001-12-05 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/lalr.c (traverse): Use arrays instead of pointers.
|
||||||
|
|
||||||
|
2001-12-05 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/nullable.c (set_nullable): Use a for loop to de-obfuscate
|
||||||
|
the handling of squeue.
|
||||||
|
`symbol >= 0' is wrong now, use `rule_table[ruleno].useful'.
|
||||||
|
|
||||||
|
2001-12-05 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
Because useless nonterminals are now kept alive (instead of being
|
||||||
|
`destroyed'), we now sometimes examine them, and store information
|
||||||
|
related to them. Hence we need to know their number, and adjust
|
||||||
|
memory allocations.
|
||||||
|
|
||||||
|
* src/reduce.c, src/reduce.h (nuseless_nonterminals): No longer
|
||||||
|
static.
|
||||||
|
* src/LR0.c (allocate_itemsets): The memory allocated to
|
||||||
|
`symbol_count' was used for two different purpose: once to count
|
||||||
|
the number of occurrences of each symbol, and later reassigned to
|
||||||
|
`shift_symbol', containing the symbol that can be shifted from a
|
||||||
|
given state.
|
||||||
|
Deobfuscate, i.e., allocate, use and free `symbol_count' here
|
||||||
|
only, and...
|
||||||
|
(new_itemsets): Allocate `shift_symbol' here.
|
||||||
|
(allocate_itemsets): symbol_count includes useless nonterminals.
|
||||||
|
Make room for them.
|
||||||
|
(free_storage): Use `free', not `XFREE', for pointers that cannot
|
||||||
|
be null.
|
||||||
|
|
||||||
|
2001-12-05 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/nullable.c (set_nullable): Deobfuscate the handling of
|
||||||
|
ritem.
|
||||||
|
`symbol >= 0' is wrong now, use `rule_table[ruleno].useful'.
|
||||||
|
|
||||||
|
2001-12-05 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/gram.c, src/gram.h (ritem_print): New.
|
||||||
|
* src/gram.c (dummy): Remove, now there is actual code in gram.c.
|
||||||
|
(This useless function was defined only to work around VMS linkers
|
||||||
|
that can't handle compilation units with variables only).
|
||||||
|
* src/reduce.c (dump_grammar): Use it to trace the construction of
|
||||||
|
ritem.
|
||||||
|
|
||||||
|
2001-12-04 Paul Eggert <[email protected]>
|
||||||
|
|
||||||
|
* src/bison.simple (union yyalloc): Change member names
|
||||||
|
to be the same as the stack names.
|
||||||
|
(yyparse): yyptr is now union yyalloc *, not char *.
|
||||||
|
(YYSTACK_RELOCATE): Likewise. This avoids a GCC warning,
|
||||||
|
and may generate better code on some machines.
|
||||||
|
(yystpcpy): Use prototype if __STDC__ is defined, not just
|
||||||
|
if __cplusplus is defined.
|
||||||
|
|
||||||
|
2001-11-30 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* configure.in (WARNING_CFLAGS): Add -Werror when possible.
|
||||||
|
(CFLAGS): Do not include the WARNING_CFLAGS here, since GNU
|
||||||
|
Gettext doesn't compile cleanly, and dies with -Werror.
|
||||||
|
* src/Makefile.am, lib/Makefile.am, tests/atlocal.in (CFLAGS):
|
||||||
|
Include WARNING_CFLAGS here.
|
||||||
|
* lib/xstrdup.c: Include xalloc.h, so that xstrdup be declared
|
||||||
|
before being defined.
|
||||||
|
|
||||||
|
2001-11-30 Paul Eggert <[email protected]>
|
||||||
|
|
||||||
|
* lib/quotearg.h (quotearg_n, quotearg_n_style):
|
||||||
|
First arg is int, not unsigned.
|
||||||
|
* lib/quotearg.c (quotearg_n, quotearg_n_style): Likewise.
|
||||||
|
(SIZE_MAX, UINT_MAX): New macros.
|
||||||
|
(quotearg_n_options): Abort if N is negative.
|
||||||
|
Avoid overflow check on hosts where size_t is 64 bits and int
|
||||||
|
is 32 bits, as overflow is impossible there.
|
||||||
|
Fix off-by-one typo that caused unnecessary reallocation.
|
||||||
|
|
||||||
|
2001-11-30 Paul Eggert <[email protected]>
|
||||||
|
|
||||||
|
Name space cleanup in generated parser.
|
||||||
|
|
||||||
|
* doc/bison.texinfo (Bison Parser): Discuss system headers
|
||||||
|
and their effect on the user name space.
|
||||||
|
|
||||||
|
* src/bison.simple:
|
||||||
|
(YYSTACK_ALLOC, YYSTACK_FREE, union yyalloc, YYSTACK_GAP_MAX,
|
||||||
|
YYSTACK_BYTES, YYSTACK_RELOCATE): Do not define unless necessary,
|
||||||
|
i.e. unless ! defined (yyoverflow) || defined (YYERROR_VERBOSE).
|
||||||
|
|
||||||
|
(YYSIZE_T): New macro. Use it instead of size_t, to avoid infringing
|
||||||
|
on user names when possible.
|
||||||
|
|
||||||
|
(YYSTACK_USE_ALLOCA): Do not define; just use any existing defn.
|
||||||
|
Simplify test for whather <alloca.h> exists.
|
||||||
|
|
||||||
|
(<stdlib.h>): Include if we will use malloc, and if standard C or C++.
|
||||||
|
|
||||||
|
(<stdio.h>): Include if YYDEBUG.
|
||||||
|
|
||||||
|
(yymemcpy): Renamed from __yy_memcpy. Do not define unless
|
||||||
|
! defined (yyoverflow) && ! defined (yymemcpy).
|
||||||
|
|
||||||
|
(yymemcpy, yyparse): Rename local variables as needed so that
|
||||||
|
they all begin with 'yy'.
|
||||||
|
|
||||||
|
(yystrlen, yystpcpy): New functions.
|
||||||
|
|
||||||
|
(YY_DECL_NON_LSP_VARIABLES): Renamed from _YY_DECL_VARIABLES.
|
||||||
|
All uses changed.
|
||||||
|
|
||||||
|
(yyparse): size_t -> YYSIZE_T. Use yystrlen and yystpcpy
|
||||||
|
instead of relying on string.h functions. Use YYSTACK_ALLOC
|
||||||
|
and YYSTACK_FREE instead of malloc and free.
|
||||||
|
|
||||||
|
2001-11-30 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/bison.simple (YYSTACK_FREE): Use `do {;} while (0)' as empty
|
||||||
|
if body instead of `;' to pacify GCC's warnings.
|
||||||
|
|
||||||
|
2001-11-30 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
Instead of mapping the LHS of unused rules to -1, keep the LHS
|
||||||
|
valid, but flag the rules as invalid.
|
||||||
|
|
||||||
|
* src/gram.h (rule_t): `useful' is a new member.
|
||||||
|
* src/print.c (print_grammar): Adjust.
|
||||||
|
* src/derives.c (set_derives): Likewise.
|
||||||
|
* src/reader.c (packgram, reduce_output): Likewise.
|
||||||
|
* src/reduce.c (reduce_grammar_tables): Likewise.
|
||||||
|
* tests/reduce.at (Underivable Rules, Useless Rules): New.
|
||||||
|
|
||||||
|
2001-11-30 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/reduce.c (reduce_output): Formatting changes.
|
||||||
|
* src/print.c (print_results, print_grammar): Likewise.
|
||||||
|
* tests/regression.at (Rule Line Numbers)
|
||||||
|
(Solved SR Conflicts, Unresolved SR Conflicts): Adjust.
|
||||||
|
|
||||||
|
2001-11-30 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/reduce.c (nonterminals_reduce): Instead of throwing away
|
||||||
|
useless nonterminals, move them at the end of the symbol arrays.
|
||||||
|
(reduce_output): Adjust.
|
||||||
|
* tests/reduce.at (Useless Nonterminals): Adjust.
|
||||||
|
|
||||||
|
2001-11-30 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/reduce.c: Various comment/formatting changes.
|
||||||
|
(nonterminals_reduce): New, extracted from...
|
||||||
|
(reduce_grammar_tables): here.
|
||||||
|
(reduce_grammar): Call nonterminals_reduce.
|
||||||
|
|
||||||
|
2001-11-29 Paul Eggert <[email protected]>
|
||||||
|
|
||||||
|
* src/bison.simple (YYSTACK_REALLOC): Remove.
|
||||||
|
(YYSTACK_ALLOC): Resurrect this macro, with its old meaning.
|
||||||
|
(YYSTACK_FREE, YYSTACK_GAP_MAX, YYSTACK_BYTES, YYSTACK_RELOCATE):
|
||||||
|
New macros.
|
||||||
|
(union yyalloc): New type.
|
||||||
|
(__yy_memcpy): Last arg is size_t, not unsigned int, to remove
|
||||||
|
an arbitrary restriction on hosts where size_t is wider than int.
|
||||||
|
|
||||||
|
(yyparse): Don't dump core if alloca or malloc fails; instead, report
|
||||||
|
a parser stack overflow. Allocate just one block of memory for all
|
||||||
|
three stacks, instead of allocating three blocks; this typically is
|
||||||
|
faster and reduces fragmentation.
|
||||||
|
|
||||||
|
Do not limit the number of items in the stack to a value that fits
|
||||||
|
in 'int', as this is an arbitrary limit on hosts with 64-bit
|
||||||
|
size_t and 32-bit int.
|
||||||
|
|
||||||
|
2001-11-28 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/LR0.c (shifts_new): New.
|
||||||
|
(save_shifts, insert_start_shift, augment_automaton): Use it.
|
||||||
|
|
||||||
|
2001-11-28 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/closure.c (closure): `b' and `ruleno' denote the same value:
|
||||||
|
keep ruleno only.
|
||||||
|
|
||||||
|
2001-11-28 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/closure.c (closure): Instead of looping over word in array
|
||||||
|
then bits in words, loop over bits in array.
|
||||||
|
|
||||||
|
2001-11-28 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/closure.c (closure): No longer optimize the special case
|
||||||
|
where all the bits of `ruleset[r]' are set to 0, to make the code
|
||||||
|
clearer.
|
||||||
|
|
||||||
|
2001-11-28 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/closure.c (closure): `r' and `c' are new variables, used to
|
||||||
|
de-obfuscate accesses to RULESET and CORE.
|
||||||
|
|
||||||
|
2001-11-28 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/reduce.c (reduce_print): Use ngettext.
|
||||||
|
(dump_grammar): Improve the trace accuracy.
|
||||||
|
|
||||||
|
2001-11-28 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/reduce.c (dump_grammar): Don't translate trace messages.
|
||||||
|
|
||||||
|
2001-11-28 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* tests/reduce.at (Useless Terminals, Useless Nonterminals): New.
|
||||||
|
* src/reduce.c (reduce_grammar_tables): Do not free useless tags,
|
||||||
|
as all tags are free'ed afterwards.
|
||||||
|
From Enrico Scholz.
|
||||||
|
|
||||||
|
2001-11-27 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/system.h: Use intl/libgettext.h.
|
||||||
|
* src/Makefile.am (INCLUDES): Add -I $(top_srcdir).
|
||||||
|
|
||||||
|
2001-11-27 Paul Eggert <[email protected]>
|
||||||
|
|
||||||
|
* src/bison.simple (YYSTACK_REALLOC): Fix typo that caused us to
|
||||||
|
use alloca when we didn't want to, and vice versa.
|
||||||
|
|
||||||
|
2001-11-27 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* tests/torture.at (Exploding the Stack Size with Malloc):
|
||||||
|
s/YYSTACK_USE_ALLOCA_ALLOCA/YYSTACK_USE_ALLOCA/.
|
||||||
|
|
||||||
|
2001-11-27 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/files.c: Include error.h.
|
||||||
|
From Hans Aberg.
|
||||||
|
|
||||||
|
2001-11-26 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
Version 1.30e.
|
||||||
|
|
||||||
|
2001-11-26 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/reader.c (readgram): Make sure rules for mid-rule actions
|
||||||
|
have a lineno equal to that of their host rule.
|
||||||
|
Reported by Hans Aberg.
|
||||||
|
* tests/regression.at (Rule Line Numbers): New.
|
||||||
|
|
||||||
|
2001-11-26 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/LR0.c (allocate_itemsets): kernel_size contains ints, not
|
||||||
|
size_ts.
|
||||||
|
Reported by Hans Aberg.
|
||||||
|
|
||||||
|
2001-11-26 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/complain.c, src/complain.h (error): Remove, provided by
|
||||||
|
lib/error.[ch].
|
||||||
|
|
||||||
|
2001-11-26 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/reader.c (read_declarations): Don't abort on tok_illegal,
|
||||||
|
issue an error message.
|
||||||
|
* tests/regression.at (Invalid %directive): New.
|
||||||
|
Reported by Hans Aberg.
|
||||||
|
|
||||||
|
2001-11-26 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* configure.in: Invoke AC_FUNC_OBSTACK and AC_FUNC_ERROR_AT_LINE.
|
||||||
|
* lib/Makefile.am (libbison_a_SOURCES): Adjust.
|
||||||
|
|
||||||
|
2001-11-26 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/conflicts.c (conflicts_print): Don't complain at all when
|
||||||
|
there are no reduce/reduce conflicts, and as many shift/reduce
|
||||||
|
conflicts as expected.
|
||||||
|
* tests/regression.at (%expect right): Adjust.
|
||||||
|
|
||||||
|
2001-11-23 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* lib/alloca.c: Update, from fileutils.
|
||||||
|
|
||||||
|
2001-11-23 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* lib/Makefile.am (libbison_a_LIBADD): Add @ALLOCA@.
|
||||||
|
|
||||||
|
2001-11-23 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/system.h: Include alloca.h.
|
||||||
|
* src/main.c (main) [C_ALLOCA]: Call alloca (0).
|
||||||
|
|
||||||
|
2001-11-23 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/print_graph.c (print_actions): Remove `rule', unused.
|
||||||
|
* src/LR0.c (kernel_size): Contain `int' instead of `size_t' to
|
||||||
|
pacify GCC's signed < unsigned warnings.
|
||||||
|
* src/closure.c (itemsetsize): Likewise.
|
||||||
|
* src/reader.c (symbol_list_new): Static.
|
||||||
|
|
||||||
|
2001-11-23 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
Attaching lineno to buckets is stupid, since only one copy of each
|
||||||
|
symbol is kept, only the line of the first occurrence is kept too.
|
||||||
|
|
||||||
|
* src/symtab.h, src/symtab.c (bucket): Remove the line member.
|
||||||
|
* src/reader.c (rline_allocated): Remove, unused.
|
||||||
|
(symbol_list): Have a `line' member.
|
||||||
|
(symbol_list_new): New.
|
||||||
|
(readgram): Use it.
|
||||||
|
* src/print.c (print_grammar): Output the rule line numbers.
|
||||||
|
* tests/regression.at (Solved SR Conflicts)
|
||||||
|
(Unresolved SR Conflicts): Adjust.
|
||||||
|
Reported by Hans Aberg.
|
||||||
|
|
||||||
|
2001-11-20 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
Version 1.30d.
|
||||||
|
|
||||||
|
2001-11-20 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* po/sv.po: New.
|
||||||
|
* configure.in (ALL_LINGUAS): Adjust.
|
||||||
|
* po/POTFILE.in: Remove `nullable.c' and `derives.c' which no
|
||||||
|
longer contains strings to translate.
|
||||||
|
|
||||||
|
2001-11-19 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/conflicts.c (conflicts_print): Add a missing \n.
|
||||||
|
|
||||||
|
2001-11-19 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/nullable.c (nullable_print): New.
|
||||||
|
(set_nullable): Call it when tracing.
|
||||||
|
Better locality of variables.
|
||||||
|
|
||||||
|
2001-11-19 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/print.c (print_actions): Better locality of variables.
|
||||||
|
|
||||||
|
2001-11-19 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/derives.c (print_derives): Fix and enrich.
|
||||||
|
* src/closure.c (print_fderives): Likewise.
|
||||||
|
|
||||||
|
2001-11-19 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/closure.c (itemsetend): Remove, replaced with...
|
||||||
|
(itemsetsize): new.
|
||||||
|
|
||||||
|
2001-11-19 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/LR0.c (kernel_end): Remove, replaced with...
|
||||||
|
(kernel_size): new.
|
||||||
|
|
||||||
|
2001-11-19 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/conflicts.c (set_conflicts): Use arrays instead of pointers
|
||||||
|
to clarify.
|
||||||
|
|
||||||
|
2001-11-19 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/closure.c (closure): Use arrays instead of pointers to clarify.
|
||||||
|
|
||||||
|
2001-11-19 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/closure.c, src/derives.c, src/nullable.c: Adjust various
|
||||||
|
trace messages.
|
||||||
|
* src/LR0.c: Likewise.
|
||||||
|
(allocate_itemsets): Use arrays instead of pointers to clarify.
|
||||||
|
|
||||||
|
2001-11-19 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/getargs.c (statistics_flag): Replace with...
|
||||||
|
(trace_flag): New.
|
||||||
|
(longopts): Accept --trace instead of --statistics.
|
||||||
|
* src/getargs.h: Adjust.
|
||||||
|
* src/LR0.c, src/closure.c, src/derives.c, src/nullable.c,
|
||||||
|
* src/reduce.c: Use trace_flags instead of the CPP conditional TRACE.
|
||||||
|
|
||||||
|
2001-11-19 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/LR0.c (new_itemsets, get_state): Use more arrays and fewer
|
||||||
|
pointers to clarify the code.
|
||||||
|
(save_reductions, save_shifts): Factor common parts of alternatives.
|
||||||
|
|
||||||
|
2001-11-19 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/LR0.c (new_state, get_state): Complete TRACE code.
|
||||||
|
* src/closure.c: Include `reader.h' to get `tags', needed by the
|
||||||
|
trace code.
|
||||||
|
Rename the conditional DEBUG as TRACE.
|
||||||
|
Output consistently TRACEs to stderr, not stdout.
|
||||||
|
* src/derives.c: Likewise.
|
||||||
|
* src/reduce.c: (inaccessable_symbols): Using if is better style
|
||||||
|
than goto.
|
||||||
|
Use `#if TRACE' instead of `#if 0' for tracing code.
|
||||||
|
|
||||||
|
2001-11-19 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/system.h (LIST_FREE, shortcpy): New.
|
||||||
|
* src/LR0.c: Use them.
|
||||||
|
* src/output.c (free_itemsets, free_reductions, free_shifts):
|
||||||
|
Remove, replaced by LIST_FREE.
|
||||||
|
|
||||||
|
2001-11-19 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/state.h (CORE_ALLOC, SHIFTS_ALLOC, ERRS_ALLOC)
|
||||||
|
(REDUCTIONS_ALLOC): New.
|
||||||
|
* src/LR0.c, src/conflicts.c: Use them to de-obfuscate memory
|
||||||
|
allocation.
|
||||||
|
|
||||||
|
2001-11-19 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/LR0.c (new_state): Complete trace code.
|
||||||
|
* src/nullable.c (set_nullable): Don't translate traces.
|
||||||
|
|
||||||
|
2001-11-19 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/print_graph.c (print_core): Better locality of variables.
|
||||||
|
* src/print.c (print_core): Likewise.
|
||||||
|
|
||||||
|
2001-11-19 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/vcg.c: You do the output, so you are responsible of the
|
||||||
|
handling of VCG syntax, in particular: use quotearg.
|
||||||
|
* src/print_graph.c: Don't.
|
||||||
|
(print_actions): Don't output the actions as part of the nodes,
|
||||||
|
since that's the job of the edges.
|
||||||
|
(print_state): Don't output by hand: fill the node description,
|
||||||
|
and ask for its output.
|
||||||
|
|
||||||
|
2001-11-19 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/bison.simple (yyparse): When verbosely reporting an error,
|
||||||
|
no longer put additional quotes around token names.
|
||||||
|
* tests/calc.at: Adjust.
|
||||||
|
|
||||||
|
2001-11-19 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/symtab.h, src/symtab.c: `line' is a new member of `bucket'.
|
||||||
|
* src/reader.c (record_rule_lines, rline, rline_allocated): Remove.
|
||||||
|
* src/output.c: Adjust.
|
||||||
|
|
||||||
|
2001-11-19 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/gram.h (rprec, rprecsym, rassoc): Remove, now part of...
|
||||||
|
(rule_t): this.
|
||||||
|
* src/conflicts.c, src/reader.c, src/reduce.c: Adjust.
|
||||||
|
|
||||||
|
2001-11-19 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/gram.h (rule_t): New.
|
||||||
|
(rule_table): New.
|
||||||
|
(rrhs, rlhs): Remove, part of state_t.
|
||||||
|
* src/print_graph.c, src/closure.c, src/conflicts.c, src/derives.c,
|
||||||
|
* src/lalr.c, src/nullable.c, src/output.c, src/print.c,
|
||||||
|
* src/reader.c, src/reduce.c: Adjust.
|
||||||
|
|
||||||
|
2001-11-19 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/reader.c (symbols_output): New, extracted from...
|
||||||
|
(packsymbols): Here.
|
||||||
|
(reader): Call it.
|
||||||
|
|
||||||
|
2001-11-19 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/lalr.c (set_maxrhs, maxrhs): Remove, replaced with...
|
||||||
|
(maxrhs): this new function.
|
||||||
|
|
||||||
|
2001-11-19 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/lalr.c (F): New macro to access the variable F.
|
||||||
|
Adjust.
|
||||||
|
|
||||||
|
2001-11-19 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/lalr.h (LA): New macro to access the variable LA.
|
||||||
|
* src/output.c, src/lalr.c, src/print_graph.c, src/conflicts.c:
|
||||||
|
* src/lalr.c: Adjust.
|
||||||
|
|
||||||
|
2001-11-19 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/lalr.c (initialize_LA): Only initialize LA. Let...
|
||||||
|
(set_state_table): handle the `lookaheads' members.
|
||||||
|
|
||||||
|
2001-11-19 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/lalr.h (lookaheads): Removed array, whose contents is now
|
||||||
|
a member of...
|
||||||
|
(state_t): this structure.
|
||||||
|
* src/output.c, src/lalr.c, src/print_graph.c, src/conflicts.c:
|
||||||
|
Adjust.
|
||||||
|
|
||||||
|
2001-11-19 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/lalr.h (consistent): Removed array, whose contents is now
|
||||||
|
a member of...
|
||||||
|
(state_t): this structure.
|
||||||
|
* src/output.c, src/lalr.c, src/print_graph.c, src/conflicts.c:
|
||||||
|
Adjust.
|
||||||
|
|
||||||
|
2001-11-19 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/lalr.h (reduction_table, shift_table): Removed arrays, whose
|
||||||
|
contents are now members of...
|
||||||
|
(state_t): this structure.
|
||||||
|
* src/output.c, src/lalr.c, src/print_graph.c, src/conflicts.c:
|
||||||
|
Adjust.
|
||||||
|
|
||||||
|
2001-11-19 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/lalr.h (state_t): New.
|
||||||
|
(state_table): Be a state_t * instead of a core **.
|
||||||
|
(accessing_symbol): Remove, part of state_t.
|
||||||
|
* src/lalr.c: Adjust.
|
||||||
|
(set_accessing_symbol): Merge into...
|
||||||
|
(set_state_table): this.
|
||||||
|
* src/print_graph.c, src/conflicts.c: Adjust.
|
||||||
|
|
||||||
|
2001-11-14 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
Version 1.30c.
|
||||||
|
|
||||||
|
2001-11-14 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* tests/calc.at, tests/output.at, tests/regression.at,
|
||||||
|
* tests/testsuite.at, tests/torture.at: Rely on Autotest 2.52g:
|
||||||
|
now the tests are run in private dirs, therefore AC_CLEANUP and
|
||||||
|
family can be simplified to 0-ary.
|
||||||
|
* tests/atlocal.in: Now that we run `elsewhere' than in tests/,
|
||||||
|
use abs. path to find config.h.
|
||||||
|
|
||||||
|
2001-11-14 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* tests/calc.at (AT_CHECK_CALC): Don't try to check the compiler's
|
||||||
|
stderr, there can be way too much random noise.
|
||||||
|
Instead pass -Werror to GCC and rely on the exit status.
|
||||||
|
Reported by Wolfram Wagner.
|
||||||
|
|
||||||
|
2001-11-14 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/bison.simple (yyparse): Let yyls1, yyss1 and yyvs1 be
|
||||||
|
defined only if yyoverflow is defined, to avoid `warning: unused
|
||||||
|
variable `yyvs1''.
|
||||||
|
Reported by The Test Suite.
|
||||||
|
|
||||||
|
2001-11-14 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/print.c: Include reduce.h.
|
||||||
|
Reported by Hans Aberg.
|
||||||
|
|
||||||
|
2001-11-14 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/lex.c, src/lex.h (token_buffer, unlexed_token_buffer):
|
||||||
|
Revert a previous patch: these are really const.
|
||||||
|
* src/conflicts.c (conflict_report): Additional useless pair of
|
||||||
|
braces to pacify GCC's warnings for `if () if () {} else {}'.
|
||||||
|
* src/lex.c (parse_percent_token): Replace equal_offset with
|
||||||
|
arg_offset.
|
||||||
|
arg is const.
|
||||||
|
Be sure to strdup `arg' when used, since there is no reason for
|
||||||
|
token_buffer not to change.
|
||||||
|
|
||||||
|
2001-11-14 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/system.h (EXIT_SUCCESS, EXIT_FAILURE): Ensure a proper
|
||||||
|
definition.
|
||||||
|
* src/main.c (main): Use them.
|
||||||
|
Suggested by Hans Aberg.
|
||||||
|
|
||||||
|
2001-11-12 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
Version 1.30b.
|
||||||
|
|
||||||
|
* src/system.h (ngettext): Now that we use ngettext, be sure to
|
||||||
|
provide a default definition when NLS are not used that takes care
|
||||||
|
of the cardinality.
|
||||||
|
|
||||||
|
2001-11-12 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* doc/bison.texinfo: Use `$' as shell prompt, not `%'.
|
||||||
|
Use @kbd to denote user input.
|
||||||
|
(Language and Grammar): ANSIfy the example.
|
||||||
|
Adjust its layout for info/notinfo.
|
||||||
|
(Location Tracking Calc): Output error messages to stderr.
|
||||||
|
Output locations in a more GNUtically correct way.
|
||||||
|
Fix a couple of Englishos.
|
||||||
|
Adjust @group/@end group pairs.
|
||||||
|
|
||||||
|
2001-11-12 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
%expext was not functioning at all.
|
||||||
|
|
||||||
|
* src/conflicts.c (expected_conflicts): Set to -1.
|
||||||
|
(conflict_report): Use ngettext.
|
||||||
|
(conflicts_print): Check %expect and make its violation an error.
|
||||||
|
* doc/bison.texinfo (Expect Decl): Adjust.
|
||||||
|
* configure.in (AM_GNU_GETTEXT): Ask for ngettext.
|
||||||
|
* tests/regression.at (%expect not enough, %expect right)
|
||||||
|
(%expect too much): New.
|
||||||
|
|
||||||
|
2001-11-12 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* tests/regression.at (Conflicts): Rename as...
|
||||||
|
(Unresolved SR Conflicts): this.
|
||||||
|
(Solved SR Conflicts): New.
|
||||||
|
|
||||||
|
2001-11-12 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/reduce.c (print_results): Rename as...
|
||||||
|
(reduce_output): This.
|
||||||
|
Output to OUT, passed as argument, instead of output_obstack.
|
||||||
|
(dump_grammar): Likewise.
|
||||||
|
(reduce_free): New.
|
||||||
|
Also free V1.
|
||||||
|
(reduce_grammar): No longer call reduce_output, since...
|
||||||
|
* src/print.c (print_results): do it.
|
||||||
|
* src/main.c (main): Call reduce_free;
|
||||||
|
|
||||||
|
2001-11-12 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/conflicts.c (print_reductions): Accept OUT as argument.
|
||||||
|
Output to it, not to output_obstack.
|
||||||
|
* src/print.c (print_actions): Adjust.
|
||||||
|
|
||||||
|
2001-11-12 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/conflicts.c (count_sr_conflicts, count_rr_conflicts): Return
|
||||||
|
the result instead of using...
|
||||||
|
(src_total, rrc_total, src_count, rrc_count): Remove.
|
||||||
|
(any_conflicts): Remove.
|
||||||
|
(print_conflicts): Split into...
|
||||||
|
(conflicts_print, conflicts_output): New.
|
||||||
|
* src/conflicts.h: Adjust.
|
||||||
|
* src/main.c (main): Invoke both conflicts_output and conflicts_print.
|
||||||
|
* src/print.c (print_grammar): Issue `\n' between to rule outputs.
|
||||||
|
* tests/regression.at (Conflicts): New.
|
||||||
|
Reported by Tom Lane.
|
||||||
|
|
||||||
|
2001-11-12 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* tests/regression.at (Invalid input): Remove, duplicate with
|
||||||
|
``Invalid input: 1''.
|
||||||
|
|
||||||
|
2001-11-12 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* tests/torture.at (AT_DATA_STACK_TORTURE)
|
||||||
|
(Exploding the Stack Size with Alloca)
|
||||||
|
(Exploding the Stack Size with Malloc): New.
|
||||||
|
|
||||||
|
2001-11-12 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/bison.simple (YYSTACK_REALLOC): New.
|
||||||
|
(yyparse) [!yyoverflow]: Use it and free the old stack.
|
||||||
|
Reported by Per Allansson.
|
||||||
|
|
||||||
|
2001-11-05 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
Version 1.30a.
|
||||||
|
* src/lex.c (parse_percent_token): s/quotearg/quote/.
|
||||||
|
|
||||||
|
2001-11-05 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* tests/regression.at (AT_TEST_CPP_GUARD_H): Adjust the clean up
|
||||||
|
pattern.
|
||||||
|
|
||||||
|
2001-11-05 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/reader.c (parse_union_decl): Output yystype/YYSTYPE as we do
|
||||||
|
with yyltype/YYLTYPE. This allows inclusion of the generated
|
||||||
|
header within the parser if the compiler, such as GGC, accepts
|
||||||
|
multiple equivalent #defines.
|
||||||
|
|
||||||
|
2001-11-04 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/getargs.c (longopts): Support `--output'. getopt is now
|
||||||
|
able to understand that `--out' is OK: the two racing long options
|
||||||
|
are aliases.
|
||||||
|
(usage): Adjust.
|
||||||
|
* src/lex.h (tok_setopt): Remove, replaced with...
|
||||||
|
(tok_intopt, tok_stropt): these new guys.
|
||||||
|
* src/lex.c (getopt.h): Not needed.
|
||||||
|
(token_buffer, unlexed_token_buffer): Not const.
|
||||||
|
(percent_table): Promote `-' over `_' in directive names.
|
||||||
|
Active `%name-prefix', `file-prefix', and `output'.
|
||||||
|
(parse_percent_token): Accept possible arguments to directives.
|
||||||
|
Promote `-' over `_' in directive names.
|
||||||
|
* doc/bison.texinfo (Decl Summary): Split the list into
|
||||||
|
`directives for grammars' and `directives for bison'.
|
||||||
|
Sort'em.
|
||||||
|
Add description of `%name-prefix', `file-prefix', and `output'.
|
||||||
|
Promote `-' over `_' in directive names.
|
||||||
|
(Bison Options): s/%locactions/%locations/. Nice Freudian slip.
|
||||||
|
Simplify the description of `--name-prefix'.
|
||||||
|
Promote `-' over `_' in directive names.
|
||||||
|
Promote `--output' over `--output-file'.
|
||||||
|
Fix the description of `--defines'.
|
||||||
|
* tests/output.at: Exercise %file-prefix and %output.
|
||||||
|
|
||||||
|
2001-11-02 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* doc/refcard.tex: Update.
|
||||||
|
|
||||||
|
2001-11-02 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/symtab.h (SUNDEF): New.
|
||||||
|
* src/symtab.c (bucket_new): Init user_token_number to SUNDEF to
|
||||||
|
stand for `uninitialized', instead of 0.
|
||||||
|
* src/reader.c (packsymbols, parse_thong_decl): Adjust.
|
||||||
|
* src/lex.c (lex): Adjust.
|
||||||
|
|
||||||
|
* tests/calc.at (_AT_DATA_CALC_Y): Declare a token for EOF.
|
||||||
|
Number it 0.
|
||||||
|
Let yylex return it instead of a plain 0.
|
||||||
|
Reported by Dick Streefland.
|
||||||
|
|
||||||
|
2001-11-02 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* tests/regression.at (Mixing %token styles): New test.
|
||||||
|
|
||||||
|
2001-11-02 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* src/reader.c (parse_thong_decl): Formatting changes.
|
||||||
|
(token_translations_init): New, extracted from...
|
||||||
|
(packsymbols): Here.
|
||||||
|
Adjust.
|
||||||
|
|
||||||
|
2001-11-01 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* tests/regression.at (AT_TEST_CPP_GUARD_H): New.
|
||||||
|
Check that `9foo.y' produces correct cpp guards.
|
||||||
|
* src/files.c (compute_header_macro): Prepend `BISON_' to CPP
|
||||||
|
guards.
|
||||||
|
Reported by Wwp.
|
||||||
|
|
||||||
|
2001-11-01 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* tests/regression.at (Invalid input: 2): New.
|
||||||
|
* src/lex.c (unlexed_token_buffer): New.
|
||||||
|
(lex, unlex): Adjust: when unlexing, be sure to save token_buffer
|
||||||
|
too.
|
||||||
|
Reported by Wwp.
|
||||||
|
|
||||||
|
2001-11-01 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
* configure.in: Bump to 1.30a.
|
||||||
|
Adjust to newer Autotest.
|
||||||
|
|
||||||
|
2001-10-26 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
|
Version 1.30.
|
||||||
|
|
||||||
|
2001-10-26 Paul Eggert <[email protected]>
|
||||||
|
|
||||||
|
* lib/error.c, lib/error.h, lib/getopt.c, lib/getopt.h,
|
||||||
|
lib/getopt1.c, lib/obstack.c, lib/obstack.h, lib/quote.c,
|
||||||
|
lib/strnlen.c, lib/xmalloc.c, m4/c-bs-a.m4, m4/error.m4,
|
||||||
|
m4/gettext.m4, m4/lcmessage.m4, m4/malloc.m4, m4/mbstate_t.m4,
|
||||||
|
m4/progtest.m4, m4/realloc.m4, m4/strerror_r.m4:
|
||||||
|
Sync with fileutils 4.1.1.
|
||||||
|
|
||||||
2001-10-18 Akim Demaille <[email protected]>
|
2001-10-18 Akim Demaille <[email protected]>
|
||||||
|
|
||||||
Version 1.29f.
|
Version 1.29f.
|
||||||
|
|||||||
+15
@@ -1,3 +1,18 @@
|
|||||||
|
## 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 of the License, 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
|
||||||
|
|
||||||
## Process this file with automake to produce Makefile.in -*-Makefile-*-
|
## Process this file with automake to produce Makefile.in -*-Makefile-*-
|
||||||
AUTOMAKE_OPTIONS = 1.5 check-news readme-alpha dist-bzip2
|
AUTOMAKE_OPTIONS = 1.5 check-news readme-alpha dist-bzip2
|
||||||
|
|
||||||
|
|||||||
+19
-28
@@ -1,4 +1,5 @@
|
|||||||
# Makefile.in generated automatically by automake 1.5a from Makefile.am.
|
# Makefile.in generated by automake 1.5a from Makefile.am.
|
||||||
|
# @configure_input@
|
||||||
|
|
||||||
# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
|
# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
|
||||||
# Free Software Foundation, Inc.
|
# Free Software Foundation, Inc.
|
||||||
@@ -83,8 +84,8 @@ INTLBISON = @INTLBISON@
|
|||||||
INTLLIBS = @INTLLIBS@
|
INTLLIBS = @INTLLIBS@
|
||||||
INTLOBJS = @INTLOBJS@
|
INTLOBJS = @INTLOBJS@
|
||||||
INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
|
INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
|
||||||
|
LIB = @LIB@
|
||||||
LIBICONV = @LIBICONV@
|
LIBICONV = @LIBICONV@
|
||||||
LIBOBJS = @LIBOBJS@
|
|
||||||
MKINSTALLDIRS = @MKINSTALLDIRS@
|
MKINSTALLDIRS = @MKINSTALLDIRS@
|
||||||
MSGFMT = @MSGFMT@
|
MSGFMT = @MSGFMT@
|
||||||
PACKAGE = @PACKAGE@
|
PACKAGE = @PACKAGE@
|
||||||
@@ -136,9 +137,9 @@ RECURSIVE_TARGETS = info-recursive dvi-recursive install-info-recursive \
|
|||||||
uninstall-info-recursive all-recursive install-data-recursive \
|
uninstall-info-recursive all-recursive install-data-recursive \
|
||||||
install-exec-recursive installdirs-recursive install-recursive \
|
install-exec-recursive installdirs-recursive install-recursive \
|
||||||
uninstall-recursive check-recursive installcheck-recursive
|
uninstall-recursive check-recursive installcheck-recursive
|
||||||
DIST_COMMON = README ./stamp-h.in ABOUT-NLS AUTHORS COPYING ChangeLog \
|
DIST_COMMON = README ABOUT-NLS AUTHORS COPYING ChangeLog INSTALL \
|
||||||
INSTALL Makefile.am Makefile.in NEWS README-alpha THANKS \
|
Makefile.am Makefile.in NEWS README-alpha THANKS aclocal.m4 \
|
||||||
aclocal.m4 config.hin configure configure.in
|
config.hin configure configure.in
|
||||||
DIST_SUBDIRS = $(SUBDIRS)
|
DIST_SUBDIRS = $(SUBDIRS)
|
||||||
all: config.h
|
all: config.h
|
||||||
$(MAKE) $(AM_MAKEFLAGS) all-recursive
|
$(MAKE) $(AM_MAKEFLAGS) all-recursive
|
||||||
@@ -148,9 +149,7 @@ $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
|
|||||||
cd $(top_srcdir) && \
|
cd $(top_srcdir) && \
|
||||||
$(AUTOMAKE) --gnu Makefile
|
$(AUTOMAKE) --gnu Makefile
|
||||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||||
cd $(top_builddir) && \
|
cd $(top_builddir) && $(SHELL) ./config.status $@
|
||||||
CONFIG_HEADERS= CONFIG_LINKS= \
|
|
||||||
CONFIG_FILES=$@ $(SHELL) ./config.status
|
|
||||||
|
|
||||||
$(top_builddir)/config.status: $(srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
$(top_builddir)/config.status: $(srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
||||||
$(SHELL) ./config.status --recheck
|
$(SHELL) ./config.status --recheck
|
||||||
@@ -159,33 +158,25 @@ $(srcdir)/configure: $(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENC
|
|||||||
|
|
||||||
$(ACLOCAL_M4): configure.in m4/c-bs-a.m4 m4/codeset.m4 m4/dmalloc.m4 m4/error.m4 m4/gettext.m4 m4/glibc21.m4 m4/iconv.m4 m4/isc-posix.m4 m4/lcmessage.m4 m4/malloc.m4 m4/mbrtowc.m4 m4/mbstate_t.m4 m4/prereq.m4 m4/progtest.m4 m4/realloc.m4 m4/strerror_r.m4 m4/warning.m4
|
$(ACLOCAL_M4): configure.in m4/c-bs-a.m4 m4/codeset.m4 m4/dmalloc.m4 m4/error.m4 m4/gettext.m4 m4/glibc21.m4 m4/iconv.m4 m4/isc-posix.m4 m4/lcmessage.m4 m4/malloc.m4 m4/mbrtowc.m4 m4/mbstate_t.m4 m4/prereq.m4 m4/progtest.m4 m4/realloc.m4 m4/strerror_r.m4 m4/warning.m4
|
||||||
cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
|
cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
|
||||||
config.h: stamp-h
|
|
||||||
|
config.h: stamp-h1
|
||||||
@if test ! -f $@; then \
|
@if test ! -f $@; then \
|
||||||
rm -f stamp-h; \
|
rm -f stamp-h1; \
|
||||||
$(MAKE) stamp-h; \
|
$(MAKE) stamp-h1; \
|
||||||
else :; fi
|
else :; fi
|
||||||
stamp-h: $(srcdir)/config.hin $(top_builddir)/config.status
|
|
||||||
@rm -f stamp-h stamp-hT
|
stamp-h1: $(srcdir)/config.hin $(top_builddir)/config.status
|
||||||
@echo timestamp > stamp-hT 2> /dev/null
|
@rm -f stamp-h1
|
||||||
cd $(top_builddir) \
|
cd $(top_builddir) && $(SHELL) ./config.status config.h
|
||||||
&& CONFIG_FILES= CONFIG_HEADERS=config.h:config.hin \
|
|
||||||
$(SHELL) ./config.status
|
$(srcdir)/config.hin: $(top_srcdir)/configure.in $(ACLOCAL_M4)
|
||||||
@mv stamp-hT stamp-h
|
|
||||||
$(srcdir)/config.hin: $(srcdir)/./stamp-h.in
|
|
||||||
@if test ! -f $@; then \
|
|
||||||
rm -f $(srcdir)/./stamp-h.in; \
|
|
||||||
$(MAKE) $(srcdir)/./stamp-h.in; \
|
|
||||||
else :; fi
|
|
||||||
$(srcdir)/./stamp-h.in: $(top_srcdir)/configure.in $(ACLOCAL_M4)
|
|
||||||
@rm -f $(srcdir)/./stamp-h.in $(srcdir)/./stamp-h.inT
|
|
||||||
@echo timestamp > $(srcdir)/./stamp-h.inT 2> /dev/null
|
|
||||||
cd $(top_srcdir) && $(AUTOHEADER)
|
cd $(top_srcdir) && $(AUTOHEADER)
|
||||||
@mv $(srcdir)/./stamp-h.inT $(srcdir)/./stamp-h.in
|
touch $(srcdir)/config.hin
|
||||||
|
|
||||||
distclean-hdr:
|
distclean-hdr:
|
||||||
-rm -f config.h
|
-rm -f config.h
|
||||||
intl/Makefile: $(top_builddir)/config.status $(top_srcdir)/intl/Makefile.in
|
intl/Makefile: $(top_builddir)/config.status $(top_srcdir)/intl/Makefile.in
|
||||||
cd $(top_builddir) && CONFIG_FILES=$@ CONFIG_HEADERS= CONFIG_LINKS= $(SHELL) ./config.status
|
cd $(top_builddir) && $(SHELL) ./config.status $@
|
||||||
uninstall-info-am:
|
uninstall-info-am:
|
||||||
|
|
||||||
# This directory's subdirectories are mostly independent; you can cd
|
# This directory's subdirectories are mostly independent; you can cd
|
||||||
|
|||||||
@@ -1,7 +1,80 @@
|
|||||||
Bison News
|
Bison News
|
||||||
----------
|
----------
|
||||||
|
|
||||||
Changes in version 1.29f:
|
Changes in version 1.30f:
|
||||||
|
|
||||||
|
* Reduced Grammars
|
||||||
|
Fixed bugs when reporting useless nonterminals.
|
||||||
|
|
||||||
|
* 64 bit hosts
|
||||||
|
The parsers work properly on 64 bit hosts.
|
||||||
|
|
||||||
|
Changes in version 1.30e:
|
||||||
|
|
||||||
|
* Error messages
|
||||||
|
Some calls to strerror resulted in scrambled or missing error messages.
|
||||||
|
|
||||||
|
* %expect
|
||||||
|
When the number of shift/reduce conflicts is correct, don't issue
|
||||||
|
any warning.
|
||||||
|
|
||||||
|
* The verbose report includes the rule line numbers.
|
||||||
|
|
||||||
|
* Rule line numbers are fixed in traces.
|
||||||
|
|
||||||
|
Changes in version 1.30d:
|
||||||
|
|
||||||
|
* Swedish translation
|
||||||
|
|
||||||
|
* Parse errors
|
||||||
|
Verbose parse error messages from the parsers are better looking.
|
||||||
|
Before: parse error: unexpected `'/'', expecting `"number"' or `'-'' or `'(''
|
||||||
|
Now: parse error: unexpected '/', expecting "number" or '-' or '('
|
||||||
|
|
||||||
|
* Fixed VCG output
|
||||||
|
Was broken when strings aliases for symbols were used.
|
||||||
|
|
||||||
|
Changes in version 1.30c:
|
||||||
|
|
||||||
|
* Fixed a few warnings.
|
||||||
|
|
||||||
|
* Some portability issues.
|
||||||
|
|
||||||
|
Changes in version 1.30b:
|
||||||
|
|
||||||
|
* Fixed parser memory leaks.
|
||||||
|
When the generated parser was using malloc to extend its stacks, the
|
||||||
|
previous allocations were not freed.
|
||||||
|
|
||||||
|
* Fixed verbose output file.
|
||||||
|
Some newlines were missing.
|
||||||
|
Some conflicts in state descriptions were missing.
|
||||||
|
|
||||||
|
* Fixed conflict report.
|
||||||
|
Option -v was needed to get the result.
|
||||||
|
|
||||||
|
* %expect
|
||||||
|
Was not used.
|
||||||
|
Mismatches are errors, not warnings.
|
||||||
|
|
||||||
|
* Fixed incorrect processing of some invalid input.
|
||||||
|
|
||||||
|
* Fixed CPP guards: 9foo.h uses BISON_9FOO_H instead of 9FOO_H.
|
||||||
|
|
||||||
|
* Fixed some typos in the documentation.
|
||||||
|
|
||||||
|
* %token MY_EOF 0 is supported.
|
||||||
|
Before, MY_EOF was silently renumbered as 257.
|
||||||
|
|
||||||
|
* doc/refcard.tex is updated.
|
||||||
|
|
||||||
|
* %output, %file-prefix, %name-prefix.
|
||||||
|
New.
|
||||||
|
|
||||||
|
* --output
|
||||||
|
New, aliasing `--output-file'.
|
||||||
|
|
||||||
|
Changes in version 1.30, 2001-10-26:
|
||||||
|
|
||||||
* `--defines' and `--graph' have now an optionnal argument which is the
|
* `--defines' and `--graph' have now an optionnal argument which is the
|
||||||
output file name. `-d' and `-g' do not change, they do not take any
|
output file name. `-d' and `-g' do not change, they do not take any
|
||||||
@@ -10,11 +83,9 @@ Changes in version 1.29f:
|
|||||||
* `%source_extension' and `%header_extension' are removed, failed
|
* `%source_extension' and `%header_extension' are removed, failed
|
||||||
experiment.
|
experiment.
|
||||||
|
|
||||||
* The test suite is more portable.
|
* Portability fixes.
|
||||||
|
|
||||||
* Better portability.
|
Changes in version 1.29, 2001-09-07:
|
||||||
|
|
||||||
Changes in version 1.29:
|
|
||||||
|
|
||||||
* The output file does not define const, as this caused problems when used
|
* The output file does not define const, as this caused problems when used
|
||||||
with common autoconfiguration schemes. If you still use ancient compilers
|
with common autoconfiguration schemes. If you still use ancient compilers
|
||||||
@@ -45,8 +116,11 @@ Changes in version 1.29:
|
|||||||
* New directives.
|
* New directives.
|
||||||
`%yacc', `%fixed_output_files', `%defines', `%no_parser', `%verbose',
|
`%yacc', `%fixed_output_files', `%defines', `%no_parser', `%verbose',
|
||||||
`%debug', `%source_extension' and `%header_extension'.
|
`%debug', `%source_extension' and `%header_extension'.
|
||||||
|
|
||||||
|
* @$
|
||||||
|
Automatic location tracking.
|
||||||
|
|
||||||
Changes in version 1.28:
|
Changes in version 1.28, 1999-07-06:
|
||||||
|
|
||||||
* Should compile better now with K&R compilers.
|
* Should compile better now with K&R compilers.
|
||||||
|
|
||||||
@@ -78,7 +152,7 @@ Changes in version 1.26:
|
|||||||
* Generated parsers should now work even on operating systems which do
|
* Generated parsers should now work even on operating systems which do
|
||||||
not provide alloca().
|
not provide alloca().
|
||||||
|
|
||||||
Changes in version 1.25:
|
Changes in version 1.25, 1995-10-16:
|
||||||
|
|
||||||
* Errors in the input grammar are not fatal; Bison keeps reading
|
* Errors in the input grammar are not fatal; Bison keeps reading
|
||||||
the grammar file, and reports all the errors found in it.
|
the grammar file, and reports all the errors found in it.
|
||||||
@@ -119,3 +193,7 @@ Changes in version 1.22:
|
|||||||
Changes in version 1.20:
|
Changes in version 1.20:
|
||||||
|
|
||||||
Output file does not redefine const for C++.
|
Output file does not redefine const for C++.
|
||||||
|
|
||||||
|
Local Variables:
|
||||||
|
mode: outline
|
||||||
|
End:
|
||||||
|
|||||||
@@ -2,11 +2,13 @@ Bison was originally written by Robert Corbett. It would not be what
|
|||||||
it is today without the invaluable help of these people:
|
it is today without the invaluable help of these people:
|
||||||
|
|
||||||
Airy Andre [email protected]
|
Airy Andre [email protected]
|
||||||
Akim Demaille akim@epita.fr
|
Akim Demaille akim@freefriends.org
|
||||||
Albert Chin-A-Young [email protected]
|
Albert Chin-A-Young [email protected]
|
||||||
Alexander Belopolsky [email protected]
|
Alexander Belopolsky [email protected]
|
||||||
Daniel Hagerty [email protected]
|
Daniel Hagerty [email protected]
|
||||||
David J. MacKenzie [email protected]
|
David J. MacKenzie [email protected]
|
||||||
|
Dick Streefland [email protected]
|
||||||
|
Enrico Scholz [email protected]
|
||||||
Fabrice Bauzac [email protected]
|
Fabrice Bauzac [email protected]
|
||||||
Hans Aberg [email protected]
|
Hans Aberg [email protected]
|
||||||
Jesse Thilo [email protected]
|
Jesse Thilo [email protected]
|
||||||
@@ -19,10 +21,15 @@ Neil Booth [email protected]
|
|||||||
Noah Friedman [email protected]
|
Noah Friedman [email protected]
|
||||||
Pascal Bart [email protected]
|
Pascal Bart [email protected]
|
||||||
Paul Eggert [email protected]
|
Paul Eggert [email protected]
|
||||||
|
Per Allansson [email protected]
|
||||||
|
Peter Hámorský [email protected]
|
||||||
Piotr Gackiewicz [email protected]
|
Piotr Gackiewicz [email protected]
|
||||||
Richard Stallman [email protected]
|
Richard Stallman [email protected]
|
||||||
Robert Anisko [email protected]
|
Robert Anisko [email protected]
|
||||||
Shura [email protected]
|
Shura [email protected]
|
||||||
|
Tom Lane [email protected]
|
||||||
|
Wolfram Wagner [email protected]
|
||||||
|
Wwp [email protected]
|
||||||
|
|
||||||
Many people are not named here because we lost track of them. We
|
Many people are not named here because we lost track of them. We
|
||||||
thank them! Please, help us keeping this list up to date.
|
thank them! Please, help us keeping this list up to date.
|
||||||
|
|||||||
Vendored
+152
-128
@@ -1,4 +1,4 @@
|
|||||||
# aclocal.m4 generated automatically by aclocal 1.5a
|
# aclocal.m4 generated automatically by aclocal 1.5a -*- Autoconf -*-
|
||||||
|
|
||||||
# Copyright 1996, 1997, 1998, 1999, 2000, 2001
|
# Copyright 1996, 1997, 1998, 1999, 2000, 2001
|
||||||
# Free Software Foundation, Inc.
|
# Free Software Foundation, Inc.
|
||||||
@@ -157,6 +157,8 @@ Check your system clock])
|
|||||||
fi
|
fi
|
||||||
AC_MSG_RESULT(yes)])
|
AC_MSG_RESULT(yes)])
|
||||||
|
|
||||||
|
# -*- Autoconf -*-
|
||||||
|
|
||||||
|
|
||||||
# Copyright 1997, 1999, 2000, 2001 Free Software Foundation, Inc.
|
# Copyright 1997, 1999, 2000, 2001 Free Software Foundation, Inc.
|
||||||
|
|
||||||
@@ -353,7 +355,7 @@ AC_SUBST([INSTALL_STRIP_PROGRAM])])
|
|||||||
|
|
||||||
|
|
||||||
# _AM_DEPENDENCIES(NAME)
|
# _AM_DEPENDENCIES(NAME)
|
||||||
# ---------------------
|
# ----------------------
|
||||||
# See how the compiler implements dependency checking.
|
# See how the compiler implements dependency checking.
|
||||||
# NAME is "CC", "CXX" or "OBJC".
|
# NAME is "CC", "CXX" or "OBJC".
|
||||||
# We try a few techniques and use that to set a single cache variable.
|
# We try a few techniques and use that to set a single cache variable.
|
||||||
@@ -432,8 +434,7 @@ else
|
|||||||
am_cv_$1_dependencies_compiler_type=none
|
am_cv_$1_dependencies_compiler_type=none
|
||||||
fi
|
fi
|
||||||
])
|
])
|
||||||
$1DEPMODE="depmode=$am_cv_$1_dependencies_compiler_type"
|
AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
|
||||||
AC_SUBST([$1DEPMODE])
|
|
||||||
])
|
])
|
||||||
|
|
||||||
|
|
||||||
@@ -451,7 +452,7 @@ else
|
|||||||
DEPDIR=_deps
|
DEPDIR=_deps
|
||||||
fi
|
fi
|
||||||
rmdir .deps 2>/dev/null
|
rmdir .deps 2>/dev/null
|
||||||
AC_SUBST(DEPDIR)
|
AC_SUBST([DEPDIR])
|
||||||
])
|
])
|
||||||
|
|
||||||
|
|
||||||
@@ -466,12 +467,10 @@ if test "x$enable_dependency_tracking" != xno; then
|
|||||||
AMDEPBACKSLASH='\'
|
AMDEPBACKSLASH='\'
|
||||||
fi
|
fi
|
||||||
AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
|
AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
|
||||||
pushdef([subst], defn([AC_SUBST]))
|
AC_SUBST([AMDEPBACKSLASH])
|
||||||
subst(AMDEPBACKSLASH)
|
|
||||||
popdef([subst])
|
|
||||||
])
|
])
|
||||||
|
|
||||||
# Generate code to set up dependency tracking.
|
# Generate code to set up dependency tracking. -*- Autoconf -*-
|
||||||
|
|
||||||
# Copyright 1999, 2000, 2001 Free Software Foundation, Inc.
|
# Copyright 1999, 2000, 2001 Free Software Foundation, Inc.
|
||||||
|
|
||||||
@@ -490,24 +489,18 @@ popdef([subst])
|
|||||||
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
# 02111-1307, USA.
|
# 02111-1307, USA.
|
||||||
|
|
||||||
# This macro should only be invoked once -- use via AC_REQUIRE.
|
#serial 2
|
||||||
# Usage:
|
|
||||||
# AM_OUTPUT_DEPENDENCY_COMMANDS
|
|
||||||
|
|
||||||
#
|
# _AM_OUTPUT_DEPENDENCY_COMMANDS
|
||||||
# This code is only required when automatic dependency tracking
|
# ------------------------------
|
||||||
# is enabled. FIXME. This creates each `.P' file that we will
|
AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
|
||||||
# need in order to bootstrap the dependency handling code.
|
[for mf in $CONFIG_FILES; do
|
||||||
AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],[
|
case $mf in
|
||||||
AC_OUTPUT_COMMANDS([
|
|
||||||
test x"$AMDEP_TRUE" != x"" ||
|
|
||||||
for mf in $CONFIG_FILES; do
|
|
||||||
case "$mf" in
|
|
||||||
Makefile) dirpart=.;;
|
Makefile) dirpart=.;;
|
||||||
*/Makefile) dirpart=`echo "$mf" | sed -e 's|/[^/]*$||'`;;
|
*/Makefile) dirpart=`AS_DIRNAME("$mf")`;;
|
||||||
*) continue;;
|
*) continue;;
|
||||||
esac
|
esac
|
||||||
grep '^DEP_FILES *= *[^ #]' < "$mf" > /dev/null || continue
|
grep '^DEP_FILES *= *[[^ @%:@]]' < "$mf" > /dev/null || continue
|
||||||
# Extract the definition of DEP_FILES from the Makefile without
|
# Extract the definition of DEP_FILES from the Makefile without
|
||||||
# running `make'.
|
# running `make'.
|
||||||
DEPDIR=`sed -n -e '/^DEPDIR = / s///p' < "$mf"`
|
DEPDIR=`sed -n -e '/^DEPDIR = / s///p' < "$mf"`
|
||||||
@@ -531,14 +524,27 @@ for mf in $CONFIG_FILES; do
|
|||||||
sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
|
sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
|
||||||
# Make sure the directory exists.
|
# Make sure the directory exists.
|
||||||
test -f "$dirpart/$file" && continue
|
test -f "$dirpart/$file" && continue
|
||||||
fdir=`echo "$file" | sed -e 's|/[^/]*$||'`
|
fdir=`AS_DIRNAME(["$file"])`
|
||||||
$ac_aux_dir/mkinstalldirs "$dirpart/$fdir" > /dev/null 2>&1
|
AS_MKDIR_P([$dirpart/$fdir])
|
||||||
# echo "creating $dirpart/$file"
|
# echo "creating $dirpart/$file"
|
||||||
echo '# dummy' > "$dirpart/$file"
|
echo '# dummy' > "$dirpart/$file"
|
||||||
done
|
done
|
||||||
done
|
done
|
||||||
], [AMDEP_TRUE="$AMDEP_TRUE"
|
])# _AM_OUTPUT_DEPENDENCY_COMMANDS
|
||||||
ac_aux_dir="$ac_aux_dir"])])
|
|
||||||
|
|
||||||
|
# AM_OUTPUT_DEPENDENCY_COMMANDS
|
||||||
|
# -----------------------------
|
||||||
|
# This macro should only be invoked once -- use via AC_REQUIRE.
|
||||||
|
#
|
||||||
|
# This code is only required when automatic dependency tracking
|
||||||
|
# is enabled. FIXME. This creates each `.P' file that we will
|
||||||
|
# need in order to bootstrap the dependency handling code.
|
||||||
|
AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
|
||||||
|
[AC_CONFIG_COMMANDS([depfiles],
|
||||||
|
[test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
|
||||||
|
[AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
|
||||||
|
])
|
||||||
|
|
||||||
# AM_MAKE_INCLUDE()
|
# AM_MAKE_INCLUDE()
|
||||||
# -----------------
|
# -----------------
|
||||||
@@ -657,32 +663,15 @@ fi])
|
|||||||
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
# 02111-1307, USA.
|
# 02111-1307, USA.
|
||||||
|
|
||||||
# serial 4
|
AC_PREREQ([2.52])
|
||||||
|
|
||||||
|
# serial 6
|
||||||
|
|
||||||
# When config.status generates a header, we must update the stamp-h file.
|
# When config.status generates a header, we must update the stamp-h file.
|
||||||
# This file resides in the same directory as the config header
|
# This file resides in the same directory as the config header
|
||||||
# that is generated. We must strip everything past the first ":",
|
# that is generated. We must strip everything past the first ":",
|
||||||
# and everything past the last "/".
|
# and everything past the last "/".
|
||||||
|
|
||||||
AC_PREREQ([2.52])
|
|
||||||
|
|
||||||
AC_DEFUN([AM_CONFIG_HEADER],
|
|
||||||
[dnl init our file count if it isn't already
|
|
||||||
m4_ifndef([_AM_Config_Header_Index], m4_define([_AM_Config_Header_Index], [0]))
|
|
||||||
dnl prepare to store our destination file list for use in config.status
|
|
||||||
AC_FOREACH([_AM_File], [$1],
|
|
||||||
[m4_pushdef([_AM_Dest], m4_patsubst(_AM_File, [:.*]))
|
|
||||||
m4_define([_AM_Config_Header_Index],
|
|
||||||
m4_incr(_AM_Config_Header_Index))
|
|
||||||
dnl and add it to the list of files AC keeps track of, along
|
|
||||||
dnl with our hook
|
|
||||||
AC_CONFIG_HEADERS(_AM_File,
|
|
||||||
[# update the timestamp
|
|
||||||
echo timestamp >"AS_ESCAPE(_AM_DIRNAME(]_AM_Dest[))/stamp-h]_AM_Config_Header_Index["
|
|
||||||
][$2]m4_ifval([$3], [, [$3]]))
|
|
||||||
m4_popdef([_AM_Dest])])
|
|
||||||
]) # AM_CONFIG_HEADER
|
|
||||||
|
|
||||||
# _AM_DIRNAME(PATH)
|
# _AM_DIRNAME(PATH)
|
||||||
# -----------------
|
# -----------------
|
||||||
# Like AS_DIRNAME, only do it during macro expansion
|
# Like AS_DIRNAME, only do it during macro expansion
|
||||||
@@ -694,7 +683,44 @@ AC_DEFUN([_AM_DIRNAME],
|
|||||||
patsubst([$1], [^\(/\).*], [\1])),
|
patsubst([$1], [^\(/\).*], [\1])),
|
||||||
patsubst([$1], [^\(//\)\([^/].*\|$\)], [\1])),
|
patsubst([$1], [^\(//\)\([^/].*\|$\)], [\1])),
|
||||||
patsubst([$1], [^\(.*[^/]\)//*[^/][^/]*/*$], [\1]))[]dnl
|
patsubst([$1], [^\(.*[^/]\)//*[^/][^/]*/*$], [\1]))[]dnl
|
||||||
]) # _AM_DIRNAME
|
])# _AM_DIRNAME
|
||||||
|
|
||||||
|
|
||||||
|
# The stamp files are numbered to have different names.
|
||||||
|
# We could number them on a directory basis, but that's additional
|
||||||
|
# complications, let's have a unique counter.
|
||||||
|
m4_define([_AM_STAMP_Count], [0])
|
||||||
|
|
||||||
|
|
||||||
|
# _AM_STAMP(HEADER)
|
||||||
|
# -----------------
|
||||||
|
# The name of the stamp file for HEADER.
|
||||||
|
AC_DEFUN([_AM_STAMP],
|
||||||
|
[m4_define([_AM_STAMP_Count], m4_incr(_AM_STAMP_Count))dnl
|
||||||
|
AS_ESCAPE(_AM_DIRNAME(patsubst([$1],
|
||||||
|
[:.*])))/stamp-h[]_AM_STAMP_Count])
|
||||||
|
|
||||||
|
|
||||||
|
# _AM_CONFIG_HEADER(HEADER[:SOURCES], COMMANDS, INIT-COMMANDS)
|
||||||
|
# ------------------------------------------------------------
|
||||||
|
# We used to try to get a real timestamp in stamp-h. But the fear is that
|
||||||
|
# that will cause unnecessary cvs conflicts.
|
||||||
|
AC_DEFUN([_AM_CONFIG_HEADER],
|
||||||
|
[# Add the stamp file to the list of files AC keeps track of,
|
||||||
|
# along with our hook.
|
||||||
|
AC_CONFIG_HEADERS([$1],
|
||||||
|
[# update the timestamp
|
||||||
|
echo 'timestamp for $1' >"_AM_STAMP([$1])"
|
||||||
|
$2],
|
||||||
|
[$3])
|
||||||
|
])# _AM_CONFIG_HEADER
|
||||||
|
|
||||||
|
|
||||||
|
# AM_CONFIG_HEADER(HEADER[:SOURCES]..., COMMANDS, INIT-COMMANDS)
|
||||||
|
# --------------------------------------------------------------
|
||||||
|
AC_DEFUN([AM_CONFIG_HEADER],
|
||||||
|
[AC_FOREACH([_AM_File], [$1], [_AM_CONFIG_HEADER(_AM_File, [$2], [$3])])
|
||||||
|
])# AM_CONFIG_HEADER
|
||||||
|
|
||||||
#serial 1
|
#serial 1
|
||||||
# This test replaces the one in autoconf.
|
# This test replaces the one in autoconf.
|
||||||
@@ -871,19 +897,19 @@ AC_SUBST(U)dnl
|
|||||||
AC_SUBST(ANSI2KNR)dnl
|
AC_SUBST(ANSI2KNR)dnl
|
||||||
])
|
])
|
||||||
|
|
||||||
#serial 3
|
#serial 5
|
||||||
|
|
||||||
dnl From Jim Meyering.
|
dnl From Jim Meyering.
|
||||||
dnl Determine whether malloc accepts 0 as its argument.
|
dnl Determine whether malloc accepts 0 as its argument.
|
||||||
dnl If it doesn't, arrange to use the replacement function.
|
dnl If it doesn't, arrange to use the replacement function.
|
||||||
dnl
|
dnl
|
||||||
|
|
||||||
AC_DEFUN(jm_FUNC_MALLOC,
|
AC_DEFUN([jm_FUNC_MALLOC],
|
||||||
[
|
[
|
||||||
dnl xmalloc.c requires that this symbol be defined so it doesn't
|
dnl xmalloc.c requires that this symbol be defined so it doesn't
|
||||||
dnl mistakenly use a broken malloc -- as it might if this test were omitted.
|
dnl mistakenly use a broken malloc -- as it might if this test were omitted.
|
||||||
AC_DEFINE_UNQUOTED(HAVE_DONE_WORKING_MALLOC_CHECK, 1,
|
AC_DEFINE(HAVE_DONE_WORKING_MALLOC_CHECK, 1,
|
||||||
[Define if the malloc check has been performed. ])
|
[Define if the malloc check has been performed. ])
|
||||||
|
|
||||||
AC_CACHE_CHECK([for working malloc], jm_cv_func_working_malloc,
|
AC_CACHE_CHECK([for working malloc], jm_cv_func_working_malloc,
|
||||||
[AC_TRY_RUN([
|
[AC_TRY_RUN([
|
||||||
@@ -900,26 +926,25 @@ AC_DEFUN(jm_FUNC_MALLOC,
|
|||||||
jm_cv_func_working_malloc=no)
|
jm_cv_func_working_malloc=no)
|
||||||
])
|
])
|
||||||
if test $jm_cv_func_working_malloc = no; then
|
if test $jm_cv_func_working_malloc = no; then
|
||||||
AC_SUBST(LIBOBJS)
|
AC_LIBOBJ(malloc)
|
||||||
LIBOBJS="$LIBOBJS malloc.$ac_objext"
|
AC_DEFINE(malloc, rpl_malloc,
|
||||||
AC_DEFINE_UNQUOTED(malloc, rpl_malloc,
|
|
||||||
[Define to rpl_malloc if the replacement function should be used.])
|
[Define to rpl_malloc if the replacement function should be used.])
|
||||||
fi
|
fi
|
||||||
])
|
])
|
||||||
|
|
||||||
#serial 3
|
#serial 5
|
||||||
|
|
||||||
dnl From Jim Meyering.
|
dnl From Jim Meyering.
|
||||||
dnl Determine whether realloc works when both arguments are 0.
|
dnl Determine whether realloc works when both arguments are 0.
|
||||||
dnl If it doesn't, arrange to use the replacement function.
|
dnl If it doesn't, arrange to use the replacement function.
|
||||||
dnl
|
dnl
|
||||||
|
|
||||||
AC_DEFUN(jm_FUNC_REALLOC,
|
AC_DEFUN([jm_FUNC_REALLOC],
|
||||||
[
|
[
|
||||||
dnl xmalloc.c requires that this symbol be defined so it doesn't
|
dnl xmalloc.c requires that this symbol be defined so it doesn't
|
||||||
dnl mistakenly use a broken realloc -- as it might if this test were omitted.
|
dnl mistakenly use a broken realloc -- as it might if this test were omitted.
|
||||||
AC_DEFINE_UNQUOTED(HAVE_DONE_WORKING_REALLOC_CHECK, 1,
|
AC_DEFINE(HAVE_DONE_WORKING_REALLOC_CHECK, 1,
|
||||||
[Define if the realloc check has been performed. ])
|
[Define if the realloc check has been performed. ])
|
||||||
|
|
||||||
AC_CACHE_CHECK([for working realloc], jm_cv_func_working_realloc,
|
AC_CACHE_CHECK([for working realloc], jm_cv_func_working_realloc,
|
||||||
[AC_TRY_RUN([
|
[AC_TRY_RUN([
|
||||||
@@ -936,9 +961,8 @@ AC_DEFUN(jm_FUNC_REALLOC,
|
|||||||
jm_cv_func_working_realloc=no)
|
jm_cv_func_working_realloc=no)
|
||||||
])
|
])
|
||||||
if test $jm_cv_func_working_realloc = no; then
|
if test $jm_cv_func_working_realloc = no; then
|
||||||
AC_SUBST(LIBOBJS)
|
AC_LIBOBJ(realloc)
|
||||||
LIBOBJS="$LIBOBJS realloc.$ac_objext"
|
AC_DEFINE(realloc, rpl_realloc,
|
||||||
AC_DEFINE_UNQUOTED(realloc, rpl_realloc,
|
|
||||||
[Define to rpl_realloc if the replacement function should be used.])
|
[Define to rpl_realloc if the replacement function should be used.])
|
||||||
fi
|
fi
|
||||||
])
|
])
|
||||||
@@ -978,11 +1002,11 @@ AC_DEFUN([jm_FUNC_MBRTOWC],
|
|||||||
fi
|
fi
|
||||||
])
|
])
|
||||||
|
|
||||||
#serial 3
|
#serial 4
|
||||||
|
|
||||||
dnl From Paul Eggert.
|
dnl From Paul Eggert.
|
||||||
|
|
||||||
AC_DEFUN(AC_C_BACKSLASH_A,
|
AC_DEFUN([AC_C_BACKSLASH_A],
|
||||||
[
|
[
|
||||||
AC_CACHE_CHECK([whether backslash-a works in strings], ac_cv_c_backslash_a,
|
AC_CACHE_CHECK([whether backslash-a works in strings], ac_cv_c_backslash_a,
|
||||||
[AC_TRY_COMPILE([],
|
[AC_TRY_COMPILE([],
|
||||||
@@ -1002,7 +1026,7 @@ AC_DEFUN(AC_C_BACKSLASH_A,
|
|||||||
fi
|
fi
|
||||||
])
|
])
|
||||||
|
|
||||||
# serial 8
|
# serial 9
|
||||||
|
|
||||||
# From Paul Eggert.
|
# From Paul Eggert.
|
||||||
|
|
||||||
@@ -1014,7 +1038,7 @@ AC_DEFUN(AC_C_BACKSLASH_A,
|
|||||||
# (at least glibc-2.1.3) because the "_XOPEN_SOURCE 500" definition elicits
|
# (at least glibc-2.1.3) because the "_XOPEN_SOURCE 500" definition elicits
|
||||||
# a syntax error in wchar.h due to the use of undefined __int32_t.
|
# a syntax error in wchar.h due to the use of undefined __int32_t.
|
||||||
|
|
||||||
AC_DEFUN(AC_MBSTATE_T,
|
AC_DEFUN([AC_MBSTATE_T],
|
||||||
[
|
[
|
||||||
AC_CHECK_HEADERS(stdlib.h)
|
AC_CHECK_HEADERS(stdlib.h)
|
||||||
|
|
||||||
@@ -1032,25 +1056,40 @@ AC_DEFUN(AC_MBSTATE_T,
|
|||||||
[Define to a type if <wchar.h> does not define.])
|
[Define to a type if <wchar.h> does not define.])
|
||||||
fi])
|
fi])
|
||||||
|
|
||||||
#serial 1
|
#serial 4
|
||||||
|
|
||||||
dnl FIXME: put these prerequisite-only *.m4 files in a separate
|
dnl FIXME: put these prerequisite-only *.m4 files in a separate
|
||||||
dnl directory -- otherwise, they'll conflict with existing files.
|
dnl directory -- otherwise, they'll conflict with existing files.
|
||||||
|
|
||||||
dnl These are the prerequisite macros for GNU's error.c file.
|
dnl These are the prerequisite macros for GNU's error.c file.
|
||||||
AC_DEFUN(jm_PREREQ_ERROR,
|
AC_DEFUN([jm_PREREQ_ERROR],
|
||||||
[
|
[
|
||||||
AC_CHECK_FUNCS(strerror strerror_r vprintf doprnt)
|
AC_CHECK_FUNCS(strerror vprintf doprnt)
|
||||||
AC_HEADER_STDC
|
AC_CHECK_DECLS([strerror])
|
||||||
AC_FUNC_STRERROR_R
|
AC_FUNC_STRERROR_R
|
||||||
|
AC_HEADER_STDC
|
||||||
])
|
])
|
||||||
|
|
||||||
#serial 1002
|
#serial 1003
|
||||||
# Experimental replacement for the function in the latest CVS autoconf.
|
# Experimental replacement for the function in the latest CVS autoconf.
|
||||||
# If the compile-test says strerror_r doesn't work, then resort to a
|
|
||||||
# `run'-test that works on BeOS and segfaults on DEC Unix.
|
|
||||||
# Use with the error.c file in ../lib.
|
# Use with the error.c file in ../lib.
|
||||||
|
|
||||||
|
# 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. */
|
||||||
|
|
||||||
undefine([AC_FUNC_STRERROR_R])
|
undefine([AC_FUNC_STRERROR_R])
|
||||||
|
|
||||||
# AC_FUNC_STRERROR_R
|
# AC_FUNC_STRERROR_R
|
||||||
@@ -1058,57 +1097,36 @@ undefine([AC_FUNC_STRERROR_R])
|
|||||||
AC_DEFUN([AC_FUNC_STRERROR_R],
|
AC_DEFUN([AC_FUNC_STRERROR_R],
|
||||||
[AC_CHECK_DECLS([strerror_r])
|
[AC_CHECK_DECLS([strerror_r])
|
||||||
AC_CHECK_FUNCS([strerror_r])
|
AC_CHECK_FUNCS([strerror_r])
|
||||||
if test $ac_cv_func_strerror_r = yes; then
|
AC_CACHE_CHECK([whether strerror_r returns char *],
|
||||||
AC_CHECK_HEADERS(string.h)
|
ac_cv_func_strerror_r_char_p,
|
||||||
AC_CACHE_CHECK([for working strerror_r],
|
|
||||||
ac_cv_func_strerror_r_works,
|
|
||||||
[
|
[
|
||||||
AC_TRY_COMPILE(
|
ac_cv_func_strerror_r_char_p=no
|
||||||
[
|
if test $ac_cv_have_decl_strerror_r = yes; then
|
||||||
# include <stdio.h>
|
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT],
|
||||||
# if HAVE_STRING_H
|
[[
|
||||||
# include <string.h>
|
char buf[100];
|
||||||
# endif
|
char x = *strerror_r (0, buf, sizeof buf);
|
||||||
],
|
char *p = strerror_r (0, buf, sizeof buf);
|
||||||
[
|
]])],
|
||||||
char buf[100];
|
ac_cv_func_strerror_r_char_p=yes)
|
||||||
char x = *strerror_r (0, buf, sizeof buf);
|
else
|
||||||
],
|
# strerror_r is not declared. Choose between
|
||||||
ac_cv_func_strerror_r_works=yes,
|
|
||||||
ac_cv_func_strerror_r_works=no
|
|
||||||
)
|
|
||||||
if test $ac_cv_func_strerror_r_works = no; then
|
|
||||||
# strerror_r seems not to work, but now we have to choose between
|
|
||||||
# systems that have relatively inaccessible declarations for the
|
# systems that have relatively inaccessible declarations for the
|
||||||
# function. BeOS and DEC UNIX 4.0 fall in this category, but the
|
# function. BeOS and DEC UNIX 4.0 fall in this category, but the
|
||||||
# former has a strerror_r that returns char*, while the latter
|
# former has a strerror_r that returns char*, while the latter
|
||||||
# has a strerror_r that returns `int'.
|
# has a strerror_r that returns `int'.
|
||||||
# This test should segfault on the DEC system.
|
# This test should segfault on the DEC system.
|
||||||
AC_TRY_RUN(
|
AC_RUN_IFELSE([AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT
|
||||||
[
|
extern char *strerror_r ();],
|
||||||
# include <stdio.h>
|
[[char buf[100];
|
||||||
# include <string.h>
|
|
||||||
# include <ctype.h>
|
|
||||||
|
|
||||||
extern char *strerror_r ();
|
|
||||||
|
|
||||||
int
|
|
||||||
main ()
|
|
||||||
{
|
|
||||||
char buf[100];
|
|
||||||
char x = *strerror_r (0, buf, sizeof buf);
|
char x = *strerror_r (0, buf, sizeof buf);
|
||||||
exit (!isalpha (x));
|
exit (!isalpha (x));]])],
|
||||||
}
|
ac_cv_func_strerror_r_char_p=yes, , :)
|
||||||
],
|
|
||||||
ac_cv_func_strerror_r_works=yes,
|
|
||||||
ac_cv_func_strerror_r_works=no,
|
|
||||||
ac_cv_func_strerror_r_works=no)
|
|
||||||
fi
|
fi
|
||||||
])
|
])
|
||||||
if test $ac_cv_func_strerror_r_works = yes; then
|
if test $ac_cv_func_strerror_r_char_p = yes; then
|
||||||
AC_DEFINE_UNQUOTED(HAVE_WORKING_STRERROR_R, 1,
|
AC_DEFINE([STRERROR_R_CHAR_P], 1,
|
||||||
[Define to 1 if `strerror_r' returns a string.])
|
[Define to 1 if strerror_r returns char *.])
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
])# AC_FUNC_STRERROR_R
|
])# AC_FUNC_STRERROR_R
|
||||||
|
|
||||||
@@ -1136,10 +1154,12 @@ fi], [AC_MSG_RESULT(no)])
|
|||||||
#
|
#
|
||||||
# This file can be copied and used freely without restrictions. It can
|
# This file can be copied and used freely without restrictions. It can
|
||||||
# be used in projects which are not available under the GNU General Public
|
# be used in projects which are not available under the GNU General Public
|
||||||
# License but which still want to provide support for the GNU gettext
|
# License or the GNU Library General Public License but which still want
|
||||||
# functionality.
|
# to provide support for the GNU gettext functionality.
|
||||||
# Please note that the actual code of GNU gettext is covered by the GNU
|
# Please note that the actual code of the GNU gettext library is covered
|
||||||
# General Public License and is *not* in the public domain.
|
# by the GNU Library General Public License, and the rest of the GNU
|
||||||
|
# gettext package package is covered by the GNU General Public License.
|
||||||
|
# They are *not* in the public domain.
|
||||||
|
|
||||||
# serial 10
|
# serial 10
|
||||||
|
|
||||||
@@ -1374,7 +1394,7 @@ return (int) gettext ("")]ifelse([$2], need-ngettext, [ + (int) ngettext ("", ""
|
|||||||
dnl Found it, now check the version.
|
dnl Found it, now check the version.
|
||||||
AC_MSG_CHECKING([version of bison])
|
AC_MSG_CHECKING([version of bison])
|
||||||
changequote(<<,>>)dnl
|
changequote(<<,>>)dnl
|
||||||
ac_prog_version=`$INTLBISON --version 2>&1 | sed -n 's/^.*GNU Bison .* \([0-9]*\.[0-9.]*\).*$/\1/p'`
|
ac_prog_version=`$INTLBISON --version 2>&1 | sed -n 's/^.*GNU Bison.* \([0-9]*\.[0-9.]*\).*$/\1/p'`
|
||||||
case $ac_prog_version in
|
case $ac_prog_version in
|
||||||
'') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
|
'') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
|
||||||
1.2[6-9]* | 1.[3-9][0-9]* | [2-9].*)
|
1.2[6-9]* | 1.[3-9][0-9]* | [2-9].*)
|
||||||
@@ -1505,10 +1525,12 @@ strdup strtoul tsearch __argz_count __argz_stringify __argz_next])
|
|||||||
#
|
#
|
||||||
# This file can be copied and used freely without restrictions. It can
|
# This file can be copied and used freely without restrictions. It can
|
||||||
# be used in projects which are not available under the GNU General Public
|
# be used in projects which are not available under the GNU General Public
|
||||||
# License but which still want to provide support for the GNU gettext
|
# License or the GNU Library General Public License but which still want
|
||||||
# functionality.
|
# to provide support for the GNU gettext functionality.
|
||||||
# Please note that the actual code of GNU gettext is covered by the GNU
|
# Please note that the actual code of the GNU gettext library is covered
|
||||||
# General Public License and is *not* in the public domain.
|
# by the GNU Library General Public License, and the rest of the GNU
|
||||||
|
# gettext package package is covered by the GNU General Public License.
|
||||||
|
# They are *not* in the public domain.
|
||||||
|
|
||||||
# serial 2
|
# serial 2
|
||||||
|
|
||||||
@@ -1670,10 +1692,12 @@ AC_DEFUN([AM_LANGINFO_CODESET],
|
|||||||
#
|
#
|
||||||
# This file can be copied and used freely without restrictions. It can
|
# This file can be copied and used freely without restrictions. It can
|
||||||
# be used in projects which are not available under the GNU General Public
|
# be used in projects which are not available under the GNU General Public
|
||||||
# License but which still want to provide support for the GNU gettext
|
# License or the GNU Library General Public License but which still want
|
||||||
# functionality.
|
# to provide support for the GNU gettext functionality.
|
||||||
# Please note that the actual code of GNU gettext is covered by the GNU
|
# Please note that the actual code of the GNU gettext library is covered
|
||||||
# General Public License and is *not* in the public domain.
|
# by the GNU Library General Public License, and the rest of the GNU
|
||||||
|
# gettext package package is covered by the GNU General Public License.
|
||||||
|
# They are *not* in the public domain.
|
||||||
|
|
||||||
# serial 2
|
# serial 2
|
||||||
|
|
||||||
|
|||||||
+74
-66
@@ -5,29 +5,30 @@
|
|||||||
*/
|
*/
|
||||||
#undef CRAY_STACKSEG_END
|
#undef CRAY_STACKSEG_END
|
||||||
|
|
||||||
/* Define if using `alloca.c'. */
|
/* Define to 1 if using `alloca.c'. */
|
||||||
#undef C_ALLOCA
|
#undef C_ALLOCA
|
||||||
|
|
||||||
/* Define to 1 if translation of program messages to the user's native
|
/* Define to 1 if translation of program messages to the user's native
|
||||||
language is requested. */
|
language is requested. */
|
||||||
#undef ENABLE_NLS
|
#undef ENABLE_NLS
|
||||||
|
|
||||||
/* Define if you have `alloca', as a function or macro. */
|
/* Define to 1 if you have `alloca', as a function or macro. */
|
||||||
#undef HAVE_ALLOCA
|
#undef HAVE_ALLOCA
|
||||||
|
|
||||||
/* Define if you have <alloca.h> and it should be used (not on Ultrix). */
|
/* Define to 1 if you have <alloca.h> and it should be used (not on Ultrix).
|
||||||
|
*/
|
||||||
#undef HAVE_ALLOCA_H
|
#undef HAVE_ALLOCA_H
|
||||||
|
|
||||||
/* Define if you have the <argz.h> header file. */
|
/* Define to 1 if you have the <argz.h> header file. */
|
||||||
#undef HAVE_ARGZ_H
|
#undef HAVE_ARGZ_H
|
||||||
|
|
||||||
/* Define if you have the <ctype.h> header file. */
|
/* Define to 1 if you have the <ctype.h> header file. */
|
||||||
#undef HAVE_CTYPE_H
|
#undef HAVE_CTYPE_H
|
||||||
|
|
||||||
/* Define if backslash-a works in C strings. */
|
/* Define if backslash-a works in C strings. */
|
||||||
#undef HAVE_C_BACKSLASH_A
|
#undef HAVE_C_BACKSLASH_A
|
||||||
|
|
||||||
/* Define if you have the `dcgettext' function. */
|
/* Define to 1 if you have the `dcgettext' function. */
|
||||||
#undef HAVE_DCGETTEXT
|
#undef HAVE_DCGETTEXT
|
||||||
|
|
||||||
/* Define to 1 if you have the declaration of `memchr', and to 0 if you don't.
|
/* Define to 1 if you have the declaration of `memchr', and to 0 if you don't.
|
||||||
@@ -38,6 +39,10 @@
|
|||||||
*/
|
*/
|
||||||
#undef HAVE_DECL_STPCPY
|
#undef HAVE_DECL_STPCPY
|
||||||
|
|
||||||
|
/* Define to 1 if you have the declaration of `strerror', and to 0 if you
|
||||||
|
don't. */
|
||||||
|
#undef HAVE_DECL_STRERROR
|
||||||
|
|
||||||
/* Define to 1 if you have the declaration of `strerror_r', and to 0 if you
|
/* Define to 1 if you have the declaration of `strerror_r', and to 0 if you
|
||||||
don't. */
|
don't. */
|
||||||
#undef HAVE_DECL_STRERROR_R
|
#undef HAVE_DECL_STRERROR_R
|
||||||
@@ -56,46 +61,46 @@
|
|||||||
/* Define if the realloc check has been performed. */
|
/* Define if the realloc check has been performed. */
|
||||||
#undef HAVE_DONE_WORKING_REALLOC_CHECK
|
#undef HAVE_DONE_WORKING_REALLOC_CHECK
|
||||||
|
|
||||||
/* Define if you have the `doprnt' function. */
|
/* Define to 1 if you have the `doprnt' function. */
|
||||||
#undef HAVE_DOPRNT
|
#undef HAVE_DOPRNT
|
||||||
|
|
||||||
/* Define if you have the `feof_unlocked' function. */
|
/* Define to 1 if you have the `feof_unlocked' function. */
|
||||||
#undef HAVE_FEOF_UNLOCKED
|
#undef HAVE_FEOF_UNLOCKED
|
||||||
|
|
||||||
/* Define if you have the `fgets_unlocked' function. */
|
/* Define to 1 if you have the `fgets_unlocked' function. */
|
||||||
#undef HAVE_FGETS_UNLOCKED
|
#undef HAVE_FGETS_UNLOCKED
|
||||||
|
|
||||||
/* Define if you have the `getcwd' function. */
|
/* Define to 1 if you have the `getcwd' function. */
|
||||||
#undef HAVE_GETCWD
|
#undef HAVE_GETCWD
|
||||||
|
|
||||||
/* Define if you have the `getegid' function. */
|
/* Define to 1 if you have the `getegid' function. */
|
||||||
#undef HAVE_GETEGID
|
#undef HAVE_GETEGID
|
||||||
|
|
||||||
/* Define if you have the `geteuid' function. */
|
/* Define to 1 if you have the `geteuid' function. */
|
||||||
#undef HAVE_GETEUID
|
#undef HAVE_GETEUID
|
||||||
|
|
||||||
/* Define if you have the `getgid' function. */
|
/* Define to 1 if you have the `getgid' function. */
|
||||||
#undef HAVE_GETGID
|
#undef HAVE_GETGID
|
||||||
|
|
||||||
/* Define if you have the `getpagesize' function. */
|
/* Define to 1 if you have the `getpagesize' function. */
|
||||||
#undef HAVE_GETPAGESIZE
|
#undef HAVE_GETPAGESIZE
|
||||||
|
|
||||||
/* Define if the GNU gettext() function is already present or preinstalled. */
|
/* Define if the GNU gettext() function is already present or preinstalled. */
|
||||||
#undef HAVE_GETTEXT
|
#undef HAVE_GETTEXT
|
||||||
|
|
||||||
/* Define if you have the `getuid' function. */
|
/* Define to 1 if you have the `getuid' function. */
|
||||||
#undef HAVE_GETUID
|
#undef HAVE_GETUID
|
||||||
|
|
||||||
/* Define if you have the iconv() function. */
|
/* Define if you have the iconv() function. */
|
||||||
#undef HAVE_ICONV
|
#undef HAVE_ICONV
|
||||||
|
|
||||||
/* Define if you have the <inttypes.h> header file. */
|
/* Define to 1 if you have the <inttypes.h> header file. */
|
||||||
#undef HAVE_INTTYPES_H
|
#undef HAVE_INTTYPES_H
|
||||||
|
|
||||||
/* Define if you have the `isascii' function. */
|
/* Define to 1 if you have the `isascii' function. */
|
||||||
#undef HAVE_ISASCII
|
#undef HAVE_ISASCII
|
||||||
|
|
||||||
/* Define if you have the `iswprint' function. */
|
/* Define to 1 if you have the `iswprint' function. */
|
||||||
#undef HAVE_ISWPRINT
|
#undef HAVE_ISWPRINT
|
||||||
|
|
||||||
/* Define if you have <langinfo.h> and nl_langinfo(CODESET). */
|
/* Define if you have <langinfo.h> and nl_langinfo(CODESET). */
|
||||||
@@ -104,130 +109,130 @@
|
|||||||
/* Define if your <locale.h> file defines LC_MESSAGES. */
|
/* Define if your <locale.h> file defines LC_MESSAGES. */
|
||||||
#undef HAVE_LC_MESSAGES
|
#undef HAVE_LC_MESSAGES
|
||||||
|
|
||||||
/* Define if you have the <limits.h> header file. */
|
/* Define to 1 if you have the <limits.h> header file. */
|
||||||
#undef HAVE_LIMITS_H
|
#undef HAVE_LIMITS_H
|
||||||
|
|
||||||
/* Define if you have the <locale.h> header file. */
|
/* Define to 1 if you have the <locale.h> header file. */
|
||||||
#undef HAVE_LOCALE_H
|
#undef HAVE_LOCALE_H
|
||||||
|
|
||||||
/* Define if you have the <malloc.h> header file. */
|
/* Define to 1 if you have the <malloc.h> header file. */
|
||||||
#undef HAVE_MALLOC_H
|
#undef HAVE_MALLOC_H
|
||||||
|
|
||||||
/* Define to 1 if mbrtowc and mbstate_t are properly declared. */
|
/* Define to 1 if mbrtowc and mbstate_t are properly declared. */
|
||||||
#undef HAVE_MBRTOWC
|
#undef HAVE_MBRTOWC
|
||||||
|
|
||||||
/* Define if you have the `mbsinit' function. */
|
/* Define to 1 if you have the `mbsinit' function. */
|
||||||
#undef HAVE_MBSINIT
|
#undef HAVE_MBSINIT
|
||||||
|
|
||||||
/* Define if you have the `memchr' function. */
|
/* Define to 1 if you have the `memchr' function. */
|
||||||
#undef HAVE_MEMCHR
|
#undef HAVE_MEMCHR
|
||||||
|
|
||||||
/* Define if you have the <memory.h> header file. */
|
/* Define to 1 if you have the <memory.h> header file. */
|
||||||
#undef HAVE_MEMORY_H
|
#undef HAVE_MEMORY_H
|
||||||
|
|
||||||
/* Define if you have the `mempcpy' function. */
|
/* Define to 1 if you have the `mempcpy' function. */
|
||||||
#undef HAVE_MEMPCPY
|
#undef HAVE_MEMPCPY
|
||||||
|
|
||||||
/* Define if you have the `mkstemp' function. */
|
/* Define to 1 if you have the `mkstemp' function. */
|
||||||
#undef HAVE_MKSTEMP
|
#undef HAVE_MKSTEMP
|
||||||
|
|
||||||
/* Define if you have a working `mmap' system call. */
|
/* Define to 1 if you have a working `mmap' system call. */
|
||||||
#undef HAVE_MMAP
|
#undef HAVE_MMAP
|
||||||
|
|
||||||
/* Define if you have the `munmap' function. */
|
/* Define to 1 if you have the `munmap' function. */
|
||||||
#undef HAVE_MUNMAP
|
#undef HAVE_MUNMAP
|
||||||
|
|
||||||
/* Define if you have the <nl_types.h> header file. */
|
/* Define to 1 if you have the <nl_types.h> header file. */
|
||||||
#undef HAVE_NL_TYPES_H
|
#undef HAVE_NL_TYPES_H
|
||||||
|
|
||||||
/* Define if you have the `putenv' function. */
|
/* Define to 1 if libc includes obstacks. */
|
||||||
|
#undef HAVE_OBSTACK
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `putenv' function. */
|
||||||
#undef HAVE_PUTENV
|
#undef HAVE_PUTENV
|
||||||
|
|
||||||
/* Define if you have the `setenv' function. */
|
/* Define to 1 if you have the `setenv' function. */
|
||||||
#undef HAVE_SETENV
|
#undef HAVE_SETENV
|
||||||
|
|
||||||
/* Define if you have the `setlocale' function. */
|
/* Define to 1 if you have the `setlocale' function. */
|
||||||
#undef HAVE_SETLOCALE
|
#undef HAVE_SETLOCALE
|
||||||
|
|
||||||
/* Define if you have the <stddef.h> header file. */
|
/* Define to 1 if you have the <stddef.h> header file. */
|
||||||
#undef HAVE_STDDEF_H
|
#undef HAVE_STDDEF_H
|
||||||
|
|
||||||
/* Define if you have the <stdint.h> header file. */
|
/* Define to 1 if you have the <stdint.h> header file. */
|
||||||
#undef HAVE_STDINT_H
|
#undef HAVE_STDINT_H
|
||||||
|
|
||||||
/* Define if you have the <stdlib.h> header file. */
|
/* Define to 1 if you have the <stdlib.h> header file. */
|
||||||
#undef HAVE_STDLIB_H
|
#undef HAVE_STDLIB_H
|
||||||
|
|
||||||
/* Define if you have the `stpcpy' function. */
|
/* Define to 1 if you have the `stpcpy' function. */
|
||||||
#undef HAVE_STPCPY
|
#undef HAVE_STPCPY
|
||||||
|
|
||||||
/* Define if you have the `strcasecmp' function. */
|
/* Define to 1 if you have the `strcasecmp' function. */
|
||||||
#undef HAVE_STRCASECMP
|
#undef HAVE_STRCASECMP
|
||||||
|
|
||||||
/* Define if you have the `strchr' function. */
|
/* Define to 1 if you have the `strchr' function. */
|
||||||
#undef HAVE_STRCHR
|
#undef HAVE_STRCHR
|
||||||
|
|
||||||
/* Define if you have the `strdup' function. */
|
/* Define to 1 if you have the `strdup' function. */
|
||||||
#undef HAVE_STRDUP
|
#undef HAVE_STRDUP
|
||||||
|
|
||||||
/* Define if you have the `strerror' function. */
|
/* Define to 1 if you have the `strerror' function. */
|
||||||
#undef HAVE_STRERROR
|
#undef HAVE_STRERROR
|
||||||
|
|
||||||
/* Define if you have the `strerror_r' function. */
|
/* Define to 1 if you have the `strerror_r' function. */
|
||||||
#undef HAVE_STRERROR_R
|
#undef HAVE_STRERROR_R
|
||||||
|
|
||||||
/* Define if you have the <strings.h> header file. */
|
/* Define to 1 if you have the <strings.h> header file. */
|
||||||
#undef HAVE_STRINGS_H
|
#undef HAVE_STRINGS_H
|
||||||
|
|
||||||
/* Define if you have the <string.h> header file. */
|
/* Define to 1 if you have the <string.h> header file. */
|
||||||
#undef HAVE_STRING_H
|
#undef HAVE_STRING_H
|
||||||
|
|
||||||
/* Define if you have the `strndup' function. */
|
/* Define to 1 if you have the `strndup' function. */
|
||||||
#undef HAVE_STRNDUP
|
#undef HAVE_STRNDUP
|
||||||
|
|
||||||
/* Define if you have the `strnlen' function. */
|
/* Define to 1 if you have the `strnlen' function. */
|
||||||
#undef HAVE_STRNLEN
|
#undef HAVE_STRNLEN
|
||||||
|
|
||||||
/* Define if you have the `strspn' function. */
|
/* Define to 1 if you have the `strspn' function. */
|
||||||
#undef HAVE_STRSPN
|
#undef HAVE_STRSPN
|
||||||
|
|
||||||
/* Define if you have the `strtoul' function. */
|
/* Define to 1 if you have the `strtoul' function. */
|
||||||
#undef HAVE_STRTOUL
|
#undef HAVE_STRTOUL
|
||||||
|
|
||||||
/* Define if you have the <sys/param.h> header file. */
|
/* Define to 1 if you have the <sys/param.h> header file. */
|
||||||
#undef HAVE_SYS_PARAM_H
|
#undef HAVE_SYS_PARAM_H
|
||||||
|
|
||||||
/* Define if you have the <sys/stat.h> header file. */
|
/* Define to 1 if you have the <sys/stat.h> header file. */
|
||||||
#undef HAVE_SYS_STAT_H
|
#undef HAVE_SYS_STAT_H
|
||||||
|
|
||||||
/* Define if you have the <sys/types.h> header file. */
|
/* Define to 1 if you have the <sys/types.h> header file. */
|
||||||
#undef HAVE_SYS_TYPES_H
|
#undef HAVE_SYS_TYPES_H
|
||||||
|
|
||||||
/* Define if you have the `tsearch' function. */
|
/* Define to 1 if you have the `tsearch' function. */
|
||||||
#undef HAVE_TSEARCH
|
#undef HAVE_TSEARCH
|
||||||
|
|
||||||
/* Define if you have the <unistd.h> header file. */
|
/* Define to 1 if you have the <unistd.h> header file. */
|
||||||
#undef HAVE_UNISTD_H
|
#undef HAVE_UNISTD_H
|
||||||
|
|
||||||
/* Define if you have the `vprintf' function. */
|
/* Define to 1 if you have the `vprintf' function. */
|
||||||
#undef HAVE_VPRINTF
|
#undef HAVE_VPRINTF
|
||||||
|
|
||||||
/* Define if you have the <wchar.h> header file. */
|
/* Define to 1 if you have the <wchar.h> header file. */
|
||||||
#undef HAVE_WCHAR_H
|
#undef HAVE_WCHAR_H
|
||||||
|
|
||||||
/* Define if you have the <wctype.h> header file. */
|
/* Define to 1 if you have the <wctype.h> header file. */
|
||||||
#undef HAVE_WCTYPE_H
|
#undef HAVE_WCTYPE_H
|
||||||
|
|
||||||
/* Define to 1 if `strerror_r' returns a string. */
|
/* Define to 1 if you have the `__argz_count' function. */
|
||||||
#undef HAVE_WORKING_STRERROR_R
|
|
||||||
|
|
||||||
/* Define if you have the `__argz_count' function. */
|
|
||||||
#undef HAVE___ARGZ_COUNT
|
#undef HAVE___ARGZ_COUNT
|
||||||
|
|
||||||
/* Define if you have the `__argz_next' function. */
|
/* Define to 1 if you have the `__argz_next' function. */
|
||||||
#undef HAVE___ARGZ_NEXT
|
#undef HAVE___ARGZ_NEXT
|
||||||
|
|
||||||
/* Define if you have the `__argz_stringify' function. */
|
/* Define to 1 if you have the `__argz_stringify' function. */
|
||||||
#undef HAVE___ARGZ_STRINGIFY
|
#undef HAVE___ARGZ_STRINGIFY
|
||||||
|
|
||||||
/* Define as const if the declaration of iconv() needs const. */
|
/* Define as const if the declaration of iconv() needs const. */
|
||||||
@@ -247,9 +252,12 @@
|
|||||||
STACK_DIRECTION = 0 => direction of growth unknown */
|
STACK_DIRECTION = 0 => direction of growth unknown */
|
||||||
#undef STACK_DIRECTION
|
#undef STACK_DIRECTION
|
||||||
|
|
||||||
/* Define if you have the ANSI C header files. */
|
/* Define to 1 if you have the ANSI C header files. */
|
||||||
#undef STDC_HEADERS
|
#undef STDC_HEADERS
|
||||||
|
|
||||||
|
/* Define to 1 if strerror_r returns char *. */
|
||||||
|
#undef STRERROR_R_CHAR_P
|
||||||
|
|
||||||
/* Version number of package */
|
/* Version number of package */
|
||||||
#undef VERSION
|
#undef VERSION
|
||||||
|
|
||||||
@@ -259,14 +267,14 @@
|
|||||||
/* Define to 1 for GNU C library extensions. */
|
/* Define to 1 for GNU C library extensions. */
|
||||||
#undef _GNU_SOURCE
|
#undef _GNU_SOURCE
|
||||||
|
|
||||||
/* Define if on MINIX. */
|
/* Define to 1 if on MINIX. */
|
||||||
#undef _MINIX
|
#undef _MINIX
|
||||||
|
|
||||||
/* Define if the system does not provide POSIX.1 features except with this
|
/* Define to 2 if the system does not provide POSIX.1 features except with
|
||||||
defined. */
|
this defined. */
|
||||||
#undef _POSIX_1_SOURCE
|
#undef _POSIX_1_SOURCE
|
||||||
|
|
||||||
/* Define if you need to in order for `stat' and other things to work. */
|
/* Define to 1 if you need to in order for `stat' and other things to work. */
|
||||||
#undef _POSIX_SOURCE
|
#undef _POSIX_SOURCE
|
||||||
|
|
||||||
/* Define to empty if `const' does not conform to ANSI C. */
|
/* Define to empty if `const' does not conform to ANSI C. */
|
||||||
|
|||||||
+4
-5
@@ -1,4 +1,5 @@
|
|||||||
# Makefile.in generated automatically by automake 1.5a from Makefile.am.
|
# Makefile.in generated by automake 1.5a from Makefile.am.
|
||||||
|
# @configure_input@
|
||||||
|
|
||||||
# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
|
# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
|
||||||
# Free Software Foundation, Inc.
|
# Free Software Foundation, Inc.
|
||||||
@@ -83,8 +84,8 @@ INTLBISON = @INTLBISON@
|
|||||||
INTLLIBS = @INTLLIBS@
|
INTLLIBS = @INTLLIBS@
|
||||||
INTLOBJS = @INTLOBJS@
|
INTLOBJS = @INTLOBJS@
|
||||||
INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
|
INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
|
||||||
|
LIB = @LIB@
|
||||||
LIBICONV = @LIBICONV@
|
LIBICONV = @LIBICONV@
|
||||||
LIBOBJS = @LIBOBJS@
|
|
||||||
MKINSTALLDIRS = @MKINSTALLDIRS@
|
MKINSTALLDIRS = @MKINSTALLDIRS@
|
||||||
MSGFMT = @MSGFMT@
|
MSGFMT = @MSGFMT@
|
||||||
PACKAGE = @PACKAGE@
|
PACKAGE = @PACKAGE@
|
||||||
@@ -115,9 +116,7 @@ $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
|
|||||||
cd $(top_srcdir) && \
|
cd $(top_srcdir) && \
|
||||||
$(AUTOMAKE) --gnu config/Makefile
|
$(AUTOMAKE) --gnu config/Makefile
|
||||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||||
cd $(top_builddir) && \
|
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
|
||||||
CONFIG_HEADERS= CONFIG_LINKS= \
|
|
||||||
CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status
|
|
||||||
uninstall-info-am:
|
uninstall-info-am:
|
||||||
tags: TAGS
|
tags: TAGS
|
||||||
TAGS:
|
TAGS:
|
||||||
|
|||||||
Vendored
+3
-3
@@ -3,7 +3,7 @@
|
|||||||
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
|
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
|
||||||
# Free Software Foundation, Inc.
|
# Free Software Foundation, Inc.
|
||||||
|
|
||||||
timestamp='2001-10-05'
|
timestamp='2001-11-26'
|
||||||
|
|
||||||
# This file is free software; you can redistribute it and/or modify it
|
# This file is free software; you can redistribute it and/or modify it
|
||||||
# under the terms of the GNU General Public License as published by
|
# under the terms of the GNU General Public License as published by
|
||||||
@@ -947,7 +947,7 @@ EOF
|
|||||||
exit 0 ;;
|
exit 0 ;;
|
||||||
M68*:*:R3V[567]*:*)
|
M68*:*:R3V[567]*:*)
|
||||||
test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
|
test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
|
||||||
3[34]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0)
|
3[34]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0)
|
||||||
OS_REL=''
|
OS_REL=''
|
||||||
test -r /etc/.relid \
|
test -r /etc/.relid \
|
||||||
&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
|
&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
|
||||||
@@ -1056,7 +1056,7 @@ EOF
|
|||||||
*:QNX:*:4*)
|
*:QNX:*:4*)
|
||||||
echo i386-pc-qnx
|
echo i386-pc-qnx
|
||||||
exit 0 ;;
|
exit 0 ;;
|
||||||
NSR-[KW]:NONSTOP_KERNEL:*:*)
|
NSR-[GKLNPTVW]:NONSTOP_KERNEL:*:*)
|
||||||
echo nsr-tandem-nsk${UNAME_RELEASE}
|
echo nsr-tandem-nsk${UNAME_RELEASE}
|
||||||
exit 0 ;;
|
exit 0 ;;
|
||||||
*:NonStop-UX:*:*)
|
*:NonStop-UX:*:*)
|
||||||
|
|||||||
Vendored
+18
-10
@@ -3,7 +3,7 @@
|
|||||||
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
|
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
|
||||||
# Free Software Foundation, Inc.
|
# Free Software Foundation, Inc.
|
||||||
|
|
||||||
timestamp='2001-10-05'
|
timestamp='2001-12-03'
|
||||||
|
|
||||||
# This file is (in principle) common to ALL GNU software.
|
# This file is (in principle) common to ALL GNU software.
|
||||||
# The presence of a machine in this file suggests that SOME GNU software
|
# The presence of a machine in this file suggests that SOME GNU software
|
||||||
@@ -245,14 +245,13 @@ case $basic_machine in
|
|||||||
| pdp10 | pdp11 | pj | pjl \
|
| pdp10 | pdp11 | pj | pjl \
|
||||||
| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
|
| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
|
||||||
| pyramid \
|
| pyramid \
|
||||||
| s390 | s390x \
|
|
||||||
| sh | sh[34] | sh[34]eb | shbe | shle \
|
| sh | sh[34] | sh[34]eb | shbe | shle \
|
||||||
| sparc | sparc64 | sparclet | sparclite | sparcv9 | sparcv9b \
|
| sparc | sparc64 | sparclet | sparclite | sparcv9 | sparcv9b \
|
||||||
| stormy16 | strongarm \
|
| strongarm \
|
||||||
| tahoe | thumb | tic80 | tron \
|
| tahoe | thumb | tic80 | tron \
|
||||||
| v850 \
|
| v850 | v850e \
|
||||||
| we32k \
|
| we32k \
|
||||||
| x86 | xscale \
|
| x86 | xscale | xstormy16 | xtensa \
|
||||||
| z8k)
|
| z8k)
|
||||||
basic_machine=$basic_machine-unknown
|
basic_machine=$basic_machine-unknown
|
||||||
;;
|
;;
|
||||||
@@ -304,14 +303,14 @@ case $basic_machine in
|
|||||||
| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
|
| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
|
||||||
| pyramid-* \
|
| pyramid-* \
|
||||||
| romp-* | rs6000-* \
|
| romp-* | rs6000-* \
|
||||||
| s390-* | s390x-* \
|
|
||||||
| sh-* | sh[34]-* | sh[34]eb-* | shbe-* | shle-* \
|
| sh-* | sh[34]-* | sh[34]eb-* | shbe-* | shle-* \
|
||||||
| sparc-* | sparc64-* | sparc86x-* | sparclite-* \
|
| sparc-* | sparc64-* | sparc86x-* | sparclite-* \
|
||||||
| sparcv9-* | sparcv9b-* | stormy16-* | strongarm-* | sv1-* \
|
| sparcv9-* | sparcv9b-* | strongarm-* | sv1-* \
|
||||||
| t3e-* | tahoe-* | thumb-* | tic30-* | tic54x-* | tic80-* | tron-* \
|
| t3e-* | tahoe-* | thumb-* | tic30-* | tic54x-* | tic80-* | tron-* \
|
||||||
| v850-* | vax-* \
|
| v850-* | v850e-* | vax-* \
|
||||||
| we32k-* \
|
| we32k-* \
|
||||||
| x86-* | x86_64-* | xmp-* | xps100-* | xscale-* \
|
| x86-* | x86_64-* | xmp-* | xps100-* | xscale-* | xstormy16-* \
|
||||||
|
| xtensa-* \
|
||||||
| ymp-* \
|
| ymp-* \
|
||||||
| z8k-*)
|
| z8k-*)
|
||||||
;;
|
;;
|
||||||
@@ -786,6 +785,12 @@ case $basic_machine in
|
|||||||
rtpc | rtpc-*)
|
rtpc | rtpc-*)
|
||||||
basic_machine=romp-ibm
|
basic_machine=romp-ibm
|
||||||
;;
|
;;
|
||||||
|
s390 | s390-*)
|
||||||
|
basic_machine=s390-ibm
|
||||||
|
;;
|
||||||
|
s390x | s390x-*)
|
||||||
|
basic_machine=s390x-ibm
|
||||||
|
;;
|
||||||
sa29200)
|
sa29200)
|
||||||
basic_machine=a29k-amd
|
basic_machine=a29k-amd
|
||||||
os=-udi
|
os=-udi
|
||||||
@@ -1070,7 +1075,7 @@ case $os in
|
|||||||
| -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \
|
| -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \
|
||||||
| -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
|
| -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
|
||||||
| -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
|
| -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
|
||||||
| -os2* | -vos*)
|
| -os2* | -vos* | -palmos* | -uclinux* | -nucleus*)
|
||||||
# Remember, each alternative MUST END IN *, to match a version number.
|
# Remember, each alternative MUST END IN *, to match a version number.
|
||||||
;;
|
;;
|
||||||
-qnx*)
|
-qnx*)
|
||||||
@@ -1122,6 +1127,9 @@ case $os in
|
|||||||
-acis*)
|
-acis*)
|
||||||
os=-aos
|
os=-aos
|
||||||
;;
|
;;
|
||||||
|
-atheos*)
|
||||||
|
os=-atheos
|
||||||
|
;;
|
||||||
-386bsd)
|
-386bsd)
|
||||||
os=-bsd
|
os=-bsd
|
||||||
;;
|
;;
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
1.29e
|
1.30d
|
||||||
|
|||||||
+14
-10
@@ -1,5 +1,7 @@
|
|||||||
# Configure template for GNU Bison. -*-Autoconf-*-
|
# Configure template for GNU Bison. -*-Autoconf-*-
|
||||||
#
|
#
|
||||||
|
# Copyright 2001 Free Software Foundation, Inc.
|
||||||
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
# the Free Software Foundation; either version 2 of the License, or
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
@@ -16,17 +18,18 @@
|
|||||||
# 02111-1307 USA
|
# 02111-1307 USA
|
||||||
|
|
||||||
# We need a recent Autoconf to run a recent Autotest.
|
# We need a recent Autoconf to run a recent Autotest.
|
||||||
AC_PREREQ(2.52e)
|
AC_PREREQ(2.52g)
|
||||||
|
|
||||||
AC_INIT([GNU Bison], [1.29f], [[email protected]])
|
AC_INIT([GNU Bison], [1.30f], [[email protected]])
|
||||||
AC_CONFIG_AUX_DIR(config)
|
AC_CONFIG_AUX_DIR(config)
|
||||||
|
|
||||||
AM_INIT_AUTOMAKE([bison], [1.29f])
|
AM_INIT_AUTOMAKE([bison], [1.30f])
|
||||||
AM_CONFIG_HEADER(config.h:config.hin)
|
AM_CONFIG_HEADER(config.h:config.hin)
|
||||||
|
|
||||||
# Initialize the test suite.
|
# Initialize the test suite.
|
||||||
AC_CONFIG_TESTDIR(tests)
|
AC_CONFIG_TESTDIR(tests)
|
||||||
AC_CONFIG_FILES([tests/bison], [chmod +x tests/bison])
|
AC_CONFIG_FILES([tests/bison], [chmod +x tests/bison])
|
||||||
|
AC_CONFIG_FILES([tests/Makefile tests/atlocal])
|
||||||
# Needed by tests/atlocal.in.
|
# Needed by tests/atlocal.in.
|
||||||
AC_SUBST([GCC])
|
AC_SUBST([GCC])
|
||||||
|
|
||||||
@@ -58,7 +61,7 @@ if test "${enableval}" = yes; then
|
|||||||
BISON_WARNING(-Wshadow)
|
BISON_WARNING(-Wshadow)
|
||||||
BISON_WARNING(-Wstrict-prototypes)
|
BISON_WARNING(-Wstrict-prototypes)
|
||||||
BISON_WARNING(-Wwrite-strings)
|
BISON_WARNING(-Wwrite-strings)
|
||||||
CFLAGS="$CFLAGS $WARNING_CFLAGS"
|
BISON_WARNING(-Werror)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Checks for libraries.
|
# Checks for libraries.
|
||||||
@@ -79,6 +82,8 @@ AM_C_PROTOTYPES
|
|||||||
|
|
||||||
# Checks for library functions.
|
# Checks for library functions.
|
||||||
AC_FUNC_ALLOCA
|
AC_FUNC_ALLOCA
|
||||||
|
AC_FUNC_OBSTACK
|
||||||
|
AC_FUNC_ERROR_AT_LINE
|
||||||
AC_CHECK_FUNCS(mkstemp setlocale)
|
AC_CHECK_FUNCS(mkstemp setlocale)
|
||||||
AC_CHECK_DECLS([stpcpy, strndup, strnlen, memchr])
|
AC_CHECK_DECLS([stpcpy, strndup, strnlen, memchr])
|
||||||
AC_REPLACE_FUNCS(stpcpy strndup strnlen strspn memchr)
|
AC_REPLACE_FUNCS(stpcpy strndup strnlen strspn memchr)
|
||||||
@@ -88,17 +93,16 @@ jm_PREREQ_QUOTEARG
|
|||||||
jm_PREREQ_ERROR
|
jm_PREREQ_ERROR
|
||||||
AM_WITH_DMALLOC
|
AM_WITH_DMALLOC
|
||||||
|
|
||||||
ALL_LINGUAS="de es et fr ja nl tr ru"
|
ALL_LINGUAS="de es et fr ja nl ru sv tr"
|
||||||
AM_GNU_GETTEXT
|
AM_GNU_GETTEXT(, need-ngettext)
|
||||||
|
|
||||||
# This is necessary so that .o files in LIBOBJS are also built via
|
# This is necessary so that .o files in LIBOBJS are also built via
|
||||||
# the ANSI2KNR-filtering rules.
|
# the ANSI2KNR-filtering rules.
|
||||||
LIBOBJS=`echo $LIBOBJS|sed 's/\.o /\$U.o /g;s/\.o$/\$U.o/'`
|
LIB@&t@OBJS=`echo $LIB@&t@OBJS|sed 's/\.o /\$U.o /g;s/\.o$/\$U.o/'`
|
||||||
AC_SUBST(LIBOBJS)
|
AC_SUBST(LIB@&t@OBJS)
|
||||||
|
|
||||||
AC_OUTPUT([Makefile
|
AC_OUTPUT([Makefile
|
||||||
config/Makefile
|
config/Makefile
|
||||||
intl/Makefile po/Makefile.in
|
intl/Makefile po/Makefile.in
|
||||||
lib/Makefile src/Makefile doc/Makefile
|
lib/Makefile src/Makefile doc/Makefile
|
||||||
m4/Makefile
|
m4/Makefile])
|
||||||
tests/Makefile])
|
|
||||||
|
|||||||
+3
-8
@@ -1,16 +1,11 @@
|
|||||||
Makefile
|
Makefile Makefile.in
|
||||||
bison.aux
|
*.aux *.dvi *.log *.info* *.pdf *.ps
|
||||||
|
stamp-*
|
||||||
bison.cp
|
bison.cp
|
||||||
bison.cps
|
bison.cps
|
||||||
bison.dvi
|
|
||||||
bison.fn
|
bison.fn
|
||||||
bison.ky
|
bison.ky
|
||||||
bison.log
|
|
||||||
bison.pg
|
bison.pg
|
||||||
bison.ps
|
|
||||||
bison.toc
|
bison.toc
|
||||||
bison.tp
|
bison.tp
|
||||||
bison.vr
|
bison.vr
|
||||||
refcard.dvi
|
|
||||||
refcard.log
|
|
||||||
refcard.ps
|
|
||||||
|
|||||||
-404
@@ -1,404 +0,0 @@
|
|||||||
# Makefile.in generated automatically by automake 1.5a from Makefile.am.
|
|
||||||
|
|
||||||
# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
|
|
||||||
# Free Software Foundation, Inc.
|
|
||||||
# This Makefile.in is free software; the Free Software Foundation
|
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
|
||||||
# with or without modifications, as long as this notice is preserved.
|
|
||||||
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
|
|
||||||
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
|
||||||
# PARTICULAR PURPOSE.
|
|
||||||
|
|
||||||
@SET_MAKE@
|
|
||||||
|
|
||||||
SHELL = @SHELL@
|
|
||||||
|
|
||||||
srcdir = @srcdir@
|
|
||||||
top_srcdir = @top_srcdir@
|
|
||||||
VPATH = @srcdir@
|
|
||||||
prefix = @prefix@
|
|
||||||
exec_prefix = @exec_prefix@
|
|
||||||
|
|
||||||
bindir = @bindir@
|
|
||||||
sbindir = @sbindir@
|
|
||||||
libexecdir = @libexecdir@
|
|
||||||
datadir = @datadir@
|
|
||||||
sysconfdir = @sysconfdir@
|
|
||||||
sharedstatedir = @sharedstatedir@
|
|
||||||
localstatedir = @localstatedir@
|
|
||||||
libdir = @libdir@
|
|
||||||
infodir = @infodir@
|
|
||||||
mandir = @mandir@
|
|
||||||
includedir = @includedir@
|
|
||||||
oldincludedir = /usr/include
|
|
||||||
pkgdatadir = $(datadir)/@PACKAGE@
|
|
||||||
pkglibdir = $(libdir)/@PACKAGE@
|
|
||||||
pkgincludedir = $(includedir)/@PACKAGE@
|
|
||||||
top_builddir = ..
|
|
||||||
|
|
||||||
ACLOCAL = @ACLOCAL@
|
|
||||||
AUTOCONF = @AUTOCONF@
|
|
||||||
AUTOMAKE = @AUTOMAKE@
|
|
||||||
AUTOHEADER = @AUTOHEADER@
|
|
||||||
|
|
||||||
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
|
|
||||||
INSTALL = @INSTALL@
|
|
||||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
|
||||||
INSTALL_DATA = @INSTALL_DATA@
|
|
||||||
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
|
||||||
INSTALL_HEADER = $(INSTALL_DATA)
|
|
||||||
transform = @program_transform_name@
|
|
||||||
NORMAL_INSTALL = :
|
|
||||||
PRE_INSTALL = :
|
|
||||||
POST_INSTALL = :
|
|
||||||
NORMAL_UNINSTALL = :
|
|
||||||
PRE_UNINSTALL = :
|
|
||||||
POST_UNINSTALL = :
|
|
||||||
host_alias = @host_alias@
|
|
||||||
host_triplet = @host@
|
|
||||||
|
|
||||||
EXEEXT = @EXEEXT@
|
|
||||||
OBJEXT = @OBJEXT@
|
|
||||||
PATH_SEPARATOR = @PATH_SEPARATOR@
|
|
||||||
AMTAR = @AMTAR@
|
|
||||||
AUTOM4TE = @AUTOM4TE@
|
|
||||||
AWK = @AWK@
|
|
||||||
BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@
|
|
||||||
CATALOGS = @CATALOGS@
|
|
||||||
CATOBJEXT = @CATOBJEXT@
|
|
||||||
CC = @CC@
|
|
||||||
CPP = @CPP@
|
|
||||||
DATADIRNAME = @DATADIRNAME@
|
|
||||||
DEPDIR = @DEPDIR@
|
|
||||||
GCC = @GCC@
|
|
||||||
GENCAT = @GENCAT@
|
|
||||||
GLIBC21 = @GLIBC21@
|
|
||||||
GMOFILES = @GMOFILES@
|
|
||||||
GMSGFMT = @GMSGFMT@
|
|
||||||
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
|
||||||
INSTOBJEXT = @INSTOBJEXT@
|
|
||||||
INTLBISON = @INTLBISON@
|
|
||||||
INTLLIBS = @INTLLIBS@
|
|
||||||
INTLOBJS = @INTLOBJS@
|
|
||||||
INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
|
|
||||||
LIBICONV = @LIBICONV@
|
|
||||||
LIBOBJS = @LIBOBJS@
|
|
||||||
MKINSTALLDIRS = @MKINSTALLDIRS@
|
|
||||||
MSGFMT = @MSGFMT@
|
|
||||||
PACKAGE = @PACKAGE@
|
|
||||||
POFILES = @POFILES@
|
|
||||||
POSUB = @POSUB@
|
|
||||||
RANLIB = @RANLIB@
|
|
||||||
U = @U@
|
|
||||||
USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
|
|
||||||
USE_NLS = @USE_NLS@
|
|
||||||
VERSION = @VERSION@
|
|
||||||
WARNING_CFLAGS = @WARNING_CFLAGS@
|
|
||||||
am__include = @am__include@
|
|
||||||
am__quote = @am__quote@
|
|
||||||
install_sh = @install_sh@
|
|
||||||
|
|
||||||
AUTOMAKE_OPTIONS = 1.4
|
|
||||||
|
|
||||||
info_TEXINFOS = bison.texinfo
|
|
||||||
man_MANS = bison.1
|
|
||||||
bison_TEXINFOS = gpl.texi fdl.texi
|
|
||||||
|
|
||||||
EXTRA_DIST = FAQ bison.1 bison.rnh refcard.tex
|
|
||||||
|
|
||||||
CLEANFILES = refcard.dvi refcard.log refcard.ps
|
|
||||||
subdir = doc
|
|
||||||
mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs
|
|
||||||
CONFIG_HEADER = $(top_builddir)/config.h
|
|
||||||
CONFIG_CLEAN_FILES =
|
|
||||||
DIST_SOURCES =
|
|
||||||
TEXINFO_TEX = $(top_srcdir)/config/texinfo.tex
|
|
||||||
INFO_DEPS = bison.info
|
|
||||||
DVIS = bison.dvi
|
|
||||||
TEXINFOS = bison.texinfo
|
|
||||||
|
|
||||||
NROFF = nroff
|
|
||||||
MANS = $(man_MANS)
|
|
||||||
DIST_COMMON = $(bison_TEXINFOS) Makefile.am Makefile.in stamp-vti \
|
|
||||||
version.texi
|
|
||||||
all: all-am
|
|
||||||
|
|
||||||
.SUFFIXES:
|
|
||||||
.SUFFIXES: .dvi .info .ps .texinfo
|
|
||||||
$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
|
|
||||||
cd $(top_srcdir) && \
|
|
||||||
$(AUTOMAKE) --gnu doc/Makefile
|
|
||||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
|
||||||
cd $(top_builddir) && \
|
|
||||||
CONFIG_HEADERS= CONFIG_LINKS= \
|
|
||||||
CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status
|
|
||||||
|
|
||||||
$(srcdir)/version.texi: $(srcdir)/stamp-vti
|
|
||||||
@:
|
|
||||||
$(srcdir)/stamp-vti: bison.texinfo $(top_srcdir)/configure.in
|
|
||||||
@(set `$(SHELL) $(top_srcdir)/config/mdate-sh $(srcdir)/bison.texinfo`; \
|
|
||||||
echo "@set UPDATED $$1 $$2 $$3"; \
|
|
||||||
echo "@set UPDATED-MONTH $$2 $$3"; \
|
|
||||||
echo "@set EDITION $(VERSION)"; \
|
|
||||||
echo "@set VERSION $(VERSION)") > vti.tmp
|
|
||||||
@cmp -s vti.tmp $(srcdir)/version.texi \
|
|
||||||
|| (echo "Updating $(srcdir)/version.texi"; \
|
|
||||||
cp vti.tmp $(srcdir)/version.texi)
|
|
||||||
-@rm -f vti.tmp
|
|
||||||
@cp $(srcdir)/version.texi $@
|
|
||||||
|
|
||||||
mostlyclean-vti:
|
|
||||||
-rm -f vti.tmp
|
|
||||||
|
|
||||||
maintainer-clean-vti:
|
|
||||||
-rm -f $(srcdir)/stamp-vti $(srcdir)/version.texi
|
|
||||||
|
|
||||||
bison.info: bison.texinfo $(srcdir)/version.texi $(bison_TEXINFOS)
|
|
||||||
bison.dvi: bison.texinfo $(srcdir)/version.texi $(bison_TEXINFOS)
|
|
||||||
|
|
||||||
.texinfo.info:
|
|
||||||
@cd $(srcdir) && rm -f $@ $@-[0-9] $@-[0-9][0-9]
|
|
||||||
cd $(srcdir) \
|
|
||||||
&& $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) \
|
|
||||||
`echo $< | sed 's,.*/,,'`
|
|
||||||
|
|
||||||
.texinfo.dvi:
|
|
||||||
TEXINPUTS="$(top_srcdir)/config$(PATH_SEPARATOR)$$TEXINPUTS" \
|
|
||||||
MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \
|
|
||||||
$(TEXI2DVI) $<
|
|
||||||
|
|
||||||
.texinfo:
|
|
||||||
@cd $(srcdir) && rm -f $@ $@-[0-9] $@-[0-9][0-9]
|
|
||||||
cd $(srcdir) \
|
|
||||||
&& $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) \
|
|
||||||
`echo $< | sed 's,.*/,,'`
|
|
||||||
|
|
||||||
MAKEINFO = @MAKEINFO@
|
|
||||||
TEXI2DVI = texi2dvi
|
|
||||||
DVIPS = dvips
|
|
||||||
.dvi.ps:
|
|
||||||
$(DVIPS) $< -o $@
|
|
||||||
|
|
||||||
uninstall-info-am:
|
|
||||||
$(PRE_UNINSTALL)
|
|
||||||
@if (install-info --version && \
|
|
||||||
install-info --version | fgrep -i -v debian) >/dev/null 2>&1; then \
|
|
||||||
list='$(INFO_DEPS)'; \
|
|
||||||
for file in $$list; do \
|
|
||||||
echo " install-info --info-dir=$(DESTDIR)$(infodir) --remove $(DESTDIR)$(infodir)/$$file"; \
|
|
||||||
install-info --info-dir=$(DESTDIR)$(infodir) --remove $(DESTDIR)$(infodir)/$$file; \
|
|
||||||
done; \
|
|
||||||
else :; fi
|
|
||||||
@$(NORMAL_UNINSTALL)
|
|
||||||
@list='$(INFO_DEPS)'; \
|
|
||||||
for file in $$list; do \
|
|
||||||
(if cd $(DESTDIR)$(infodir); then \
|
|
||||||
echo " rm -f $$file $$file-[0-9] $$file-[0-9][0-9])"; \
|
|
||||||
rm -f $$file $$file-[0-9] $$file-[0-9][0-9]; \
|
|
||||||
else :; fi); \
|
|
||||||
done
|
|
||||||
|
|
||||||
dist-info: $(INFO_DEPS)
|
|
||||||
list='$(INFO_DEPS)'; \
|
|
||||||
for base in $$list; do \
|
|
||||||
d=$(srcdir); \
|
|
||||||
for file in $$d/$$base*; do \
|
|
||||||
relfile=`expr "$$file" : "$$d/\(.*\)"`; \
|
|
||||||
test -f $(distdir)/$$relfile || \
|
|
||||||
cp -p $$file $(distdir)/$$relfile; \
|
|
||||||
done; \
|
|
||||||
done
|
|
||||||
|
|
||||||
mostlyclean-aminfo:
|
|
||||||
-rm -f bison.aux bison.cp bison.cps bison.dvi bison.fn bison.ky bison.log \
|
|
||||||
bison.pg bison.ps bison.toc bison.tp bison.vr
|
|
||||||
|
|
||||||
maintainer-clean-aminfo:
|
|
||||||
cd $(srcdir) && \
|
|
||||||
for i in $(INFO_DEPS); do \
|
|
||||||
rm -f $$i; \
|
|
||||||
if test "`echo $$i-[0-9]*`" != "$$i-[0-9]*"; then \
|
|
||||||
rm -f $$i-[0-9]*; \
|
|
||||||
fi; \
|
|
||||||
done
|
|
||||||
|
|
||||||
man1dir = $(mandir)/man1
|
|
||||||
install-man1: $(man1_MANS) $(man_MANS)
|
|
||||||
@$(NORMAL_INSTALL)
|
|
||||||
$(mkinstalldirs) $(DESTDIR)$(man1dir)
|
|
||||||
@list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \
|
|
||||||
l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
|
|
||||||
for i in $$l2; do \
|
|
||||||
case "$$i" in \
|
|
||||||
*.1*) list="$$list $$i" ;; \
|
|
||||||
esac; \
|
|
||||||
done; \
|
|
||||||
for i in $$list; do \
|
|
||||||
if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
|
|
||||||
else file=$$i; fi; \
|
|
||||||
ext=`echo $$i | sed -e 's/^.*\\.//'`; \
|
|
||||||
inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
|
|
||||||
inst=`echo $$inst | sed -e 's/^.*\///'`; \
|
|
||||||
inst=`echo $$inst | sed '$(transform)'`.$$ext; \
|
|
||||||
echo " $(INSTALL_DATA) $$file $(DESTDIR)$(man1dir)/$$inst"; \
|
|
||||||
$(INSTALL_DATA) $$file $(DESTDIR)$(man1dir)/$$inst; \
|
|
||||||
done
|
|
||||||
uninstall-man1:
|
|
||||||
@$(NORMAL_UNINSTALL)
|
|
||||||
@list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \
|
|
||||||
l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
|
|
||||||
for i in $$l2; do \
|
|
||||||
case "$$i" in \
|
|
||||||
*.1*) list="$$list $$i" ;; \
|
|
||||||
esac; \
|
|
||||||
done; \
|
|
||||||
for i in $$list; do \
|
|
||||||
ext=`echo $$i | sed -e 's/^.*\\.//'`; \
|
|
||||||
inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
|
|
||||||
inst=`echo $$inst | sed -e 's/^.*\///'`; \
|
|
||||||
inst=`echo $$inst | sed '$(transform)'`.$$ext; \
|
|
||||||
echo " rm -f $(DESTDIR)$(man1dir)/$$inst"; \
|
|
||||||
rm -f $(DESTDIR)$(man1dir)/$$inst; \
|
|
||||||
done
|
|
||||||
tags: TAGS
|
|
||||||
TAGS:
|
|
||||||
|
|
||||||
|
|
||||||
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
|
||||||
|
|
||||||
top_distdir = ..
|
|
||||||
distdir = $(top_distdir)/$(PACKAGE)-$(VERSION)
|
|
||||||
|
|
||||||
distdir: $(DISTFILES)
|
|
||||||
@for file in $(DISTFILES); do \
|
|
||||||
if test -f $$file; then d=.; else d=$(srcdir); fi; \
|
|
||||||
dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
|
|
||||||
if test "$$dir" != "$$file" && test "$$dir" != "."; then \
|
|
||||||
$(mkinstalldirs) "$(distdir)/$$dir"; \
|
|
||||||
fi; \
|
|
||||||
if test -d $$d/$$file; then \
|
|
||||||
cp -pR $$d/$$file $(distdir) \
|
|
||||||
|| exit 1; \
|
|
||||||
else \
|
|
||||||
test -f $(distdir)/$$file \
|
|
||||||
|| cp -p $$d/$$file $(distdir)/$$file \
|
|
||||||
|| exit 1; \
|
|
||||||
fi; \
|
|
||||||
done
|
|
||||||
$(MAKE) $(AM_MAKEFLAGS) \
|
|
||||||
top_distdir="${top_distdir}" distdir="$(distdir)" \
|
|
||||||
dist-info
|
|
||||||
check-am: all-am
|
|
||||||
check: check-am
|
|
||||||
all-am: Makefile $(INFO_DEPS) $(MANS)
|
|
||||||
|
|
||||||
installdirs:
|
|
||||||
$(mkinstalldirs) $(DESTDIR)$(infodir) $(DESTDIR)$(man1dir)
|
|
||||||
|
|
||||||
install: install-am
|
|
||||||
install-exec: install-exec-am
|
|
||||||
install-data: install-data-am
|
|
||||||
uninstall: uninstall-am
|
|
||||||
|
|
||||||
install-am: all-am
|
|
||||||
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
|
|
||||||
|
|
||||||
installcheck: installcheck-am
|
|
||||||
install-strip:
|
|
||||||
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
|
||||||
`test -z '$(STRIP)' || \
|
|
||||||
echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
|
|
||||||
mostlyclean-generic:
|
|
||||||
|
|
||||||
clean-generic:
|
|
||||||
-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
|
|
||||||
|
|
||||||
distclean-generic:
|
|
||||||
-rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]*
|
|
||||||
|
|
||||||
maintainer-clean-generic:
|
|
||||||
@echo "This command is intended for maintainers to use"
|
|
||||||
@echo "it deletes files that may require special tools to rebuild."
|
|
||||||
clean: clean-am
|
|
||||||
|
|
||||||
clean-am: clean-generic mostlyclean-am
|
|
||||||
|
|
||||||
distclean: distclean-am
|
|
||||||
|
|
||||||
distclean-am: clean-am distclean-generic
|
|
||||||
|
|
||||||
dvi: dvi-am
|
|
||||||
|
|
||||||
dvi-am: $(DVIS)
|
|
||||||
|
|
||||||
info: info-am
|
|
||||||
|
|
||||||
info-am: $(INFO_DEPS)
|
|
||||||
|
|
||||||
install-data-am: install-info-am install-man
|
|
||||||
|
|
||||||
install-exec-am:
|
|
||||||
|
|
||||||
install-info: install-info-am
|
|
||||||
|
|
||||||
install-info-am: $(INFO_DEPS)
|
|
||||||
@$(NORMAL_INSTALL)
|
|
||||||
$(mkinstalldirs) $(DESTDIR)$(infodir)
|
|
||||||
@list='$(INFO_DEPS)'; \
|
|
||||||
for file in $$list; do \
|
|
||||||
d=$(srcdir); \
|
|
||||||
for ifile in echo $$d/$$file $$d/$$file-[0-9] $$d/$$file-[0-9][0-9]; do \
|
|
||||||
if test -f $$ifile; then \
|
|
||||||
relfile=`expr "$$ifile" : "$$d/\(.*\)"`; \
|
|
||||||
echo " $(INSTALL_DATA) $$ifile $(DESTDIR)$(infodir)/$$relfile"; \
|
|
||||||
$(INSTALL_DATA) $$ifile $(DESTDIR)$(infodir)/$$relfile; \
|
|
||||||
else : ; fi; \
|
|
||||||
done; \
|
|
||||||
done
|
|
||||||
@$(POST_INSTALL)
|
|
||||||
@if (install-info --version && \
|
|
||||||
install-info --version | fgrep -i -v debian) >/dev/null 2>&1; then \
|
|
||||||
list='$(INFO_DEPS)'; \
|
|
||||||
for file in $$list; do \
|
|
||||||
echo " install-info --info-dir=$(DESTDIR)$(infodir) $(DESTDIR)$(infodir)/$$file";\
|
|
||||||
install-info --info-dir=$(DESTDIR)$(infodir) $(DESTDIR)$(infodir)/$$file || :;\
|
|
||||||
done; \
|
|
||||||
else : ; fi
|
|
||||||
install-man: install-man1
|
|
||||||
|
|
||||||
installcheck-am:
|
|
||||||
|
|
||||||
maintainer-clean: maintainer-clean-am
|
|
||||||
|
|
||||||
maintainer-clean-am: distclean-am maintainer-clean-aminfo \
|
|
||||||
maintainer-clean-generic maintainer-clean-vti
|
|
||||||
|
|
||||||
mostlyclean: mostlyclean-am
|
|
||||||
|
|
||||||
mostlyclean-am: mostlyclean-aminfo mostlyclean-generic mostlyclean-vti
|
|
||||||
|
|
||||||
uninstall-am: uninstall-info-am uninstall-man
|
|
||||||
|
|
||||||
uninstall-man: uninstall-man1
|
|
||||||
|
|
||||||
.PHONY: all all-am check check-am clean clean-generic dist-info \
|
|
||||||
distclean distclean-generic distdir dvi dvi-am info info-am \
|
|
||||||
install install-am install-data install-data-am install-exec \
|
|
||||||
install-exec-am install-info install-info-am install-man \
|
|
||||||
install-man1 install-strip installcheck installcheck-am \
|
|
||||||
installdirs maintainer-clean maintainer-clean-aminfo \
|
|
||||||
maintainer-clean-generic maintainer-clean-vti mostlyclean \
|
|
||||||
mostlyclean-aminfo mostlyclean-generic mostlyclean-vti \
|
|
||||||
uninstall uninstall-am uninstall-info-am uninstall-man \
|
|
||||||
uninstall-man1
|
|
||||||
|
|
||||||
|
|
||||||
refcard.dvi: refcard.tex
|
|
||||||
tex refcard.tex
|
|
||||||
|
|
||||||
refcard.ps: refcard.dvi
|
|
||||||
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
|
||||||
# Otherwise a system limit (for SysV at least) may be exceeded.
|
|
||||||
.NOEXPORT:
|
|
||||||
-145
@@ -1,145 +0,0 @@
|
|||||||
Ceci est le fichier Info bison.info, produit par Makeinfo version 4.0b
|
|
||||||
à partir bison.texinfo.
|
|
||||||
|
|
||||||
START-INFO-DIR-ENTRY
|
|
||||||
* bison: (bison). GNU Project parser generator (yacc replacement).
|
|
||||||
END-INFO-DIR-ENTRY
|
|
||||||
|
|
||||||
This file documents the Bison parser generator.
|
|
||||||
|
|
||||||
Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1995, 1998, 1999,
|
|
||||||
2000, 2001 Free Software Foundation, Inc.
|
|
||||||
|
|
||||||
Permission is granted to make and distribute verbatim copies of this
|
|
||||||
manual provided the copyright notice and this permission notice are
|
|
||||||
preserved on all copies.
|
|
||||||
|
|
||||||
Permission is granted to copy and distribute modified versions of
|
|
||||||
this manual under the conditions for verbatim copying, provided also
|
|
||||||
that the sections entitled "GNU General Public License" and "Conditions
|
|
||||||
for Using Bison" are included exactly as in the original, and provided
|
|
||||||
that the entire resulting derived work is distributed under the terms
|
|
||||||
of a permission notice identical to this one.
|
|
||||||
|
|
||||||
Permission is granted to copy and distribute translations of this
|
|
||||||
manual into another language, under the above conditions for modified
|
|
||||||
versions, except that the sections entitled "GNU General Public
|
|
||||||
License", "Conditions for Using Bison" and this permission notice may be
|
|
||||||
included in translations approved by the Free Software Foundation
|
|
||||||
instead of in the original English.
|
|
||||||
|
|
||||||
|
|
||||||
Indirect:
|
|
||||||
bison.info-1: 1313
|
|
||||||
bison.info-2: 50691
|
|
||||||
bison.info-3: 100581
|
|
||||||
bison.info-4: 150131
|
|
||||||
bison.info-5: 197908
|
|
||||||
|
|
||||||
Tag Table:
|
|
||||||
(Indirect)
|
|
||||||
Node: Top1313
|
|
||||||
Node: Introduction8969
|
|
||||||
Node: Conditions10244
|
|
||||||
Node: Copying11708
|
|
||||||
Node: Concepts30911
|
|
||||||
Node: Language and Grammar31990
|
|
||||||
Node: Grammar in Bison37006
|
|
||||||
Node: Semantic Values38930
|
|
||||||
Node: Semantic Actions41031
|
|
||||||
Node: Locations Overview42220
|
|
||||||
Node: Bison Parser43667
|
|
||||||
Node: Stages45979
|
|
||||||
Node: Grammar Layout47262
|
|
||||||
Node: Examples48519
|
|
||||||
Node: RPN Calc49717
|
|
||||||
Node: Rpcalc Decls50691
|
|
||||||
Node: Rpcalc Rules52278
|
|
||||||
Node: Rpcalc Input54078
|
|
||||||
Node: Rpcalc Line55539
|
|
||||||
Node: Rpcalc Expr56654
|
|
||||||
Node: Rpcalc Lexer58599
|
|
||||||
Node: Rpcalc Main61171
|
|
||||||
Node: Rpcalc Error61569
|
|
||||||
Node: Rpcalc Gen62577
|
|
||||||
Node: Rpcalc Compile63726
|
|
||||||
Node: Infix Calc64601
|
|
||||||
Node: Simple Error Recovery67308
|
|
||||||
Node: Location Tracking Calc69197
|
|
||||||
Node: Ltcalc Decls69927
|
|
||||||
Node: Ltcalc Rules70836
|
|
||||||
Node: Ltcalc Lexer72897
|
|
||||||
Node: Multi-function Calc75235
|
|
||||||
Node: Mfcalc Decl76802
|
|
||||||
Node: Mfcalc Rules78825
|
|
||||||
Node: Mfcalc Symtab80205
|
|
||||||
Node: Exercises86578
|
|
||||||
Node: Grammar File87084
|
|
||||||
Node: Grammar Outline87932
|
|
||||||
Node: C Declarations88666
|
|
||||||
Node: Bison Declarations89246
|
|
||||||
Node: Grammar Rules89658
|
|
||||||
Node: C Code90118
|
|
||||||
Node: Symbols91048
|
|
||||||
Node: Rules96129
|
|
||||||
Node: Recursion97768
|
|
||||||
Node: Semantics99487
|
|
||||||
Node: Value Type100581
|
|
||||||
Node: Multiple Types101253
|
|
||||||
Node: Actions102270
|
|
||||||
Node: Action Types105055
|
|
||||||
Node: Mid-Rule Actions106358
|
|
||||||
Node: Locations111928
|
|
||||||
Node: Location Type112576
|
|
||||||
Node: Actions and Locations113134
|
|
||||||
Node: Location Default Action115290
|
|
||||||
Node: Declarations116753
|
|
||||||
Node: Token Decl118072
|
|
||||||
Node: Precedence Decl120085
|
|
||||||
Node: Union Decl121636
|
|
||||||
Node: Type Decl122480
|
|
||||||
Node: Expect Decl123386
|
|
||||||
Node: Start Decl124932
|
|
||||||
Node: Pure Decl125310
|
|
||||||
Node: Decl Summary126987
|
|
||||||
Node: Multiple Parsers132370
|
|
||||||
Node: Interface133864
|
|
||||||
Node: Parser Function134736
|
|
||||||
Node: Lexical135571
|
|
||||||
Node: Calling Convention136977
|
|
||||||
Node: Token Values139748
|
|
||||||
Node: Token Positions140897
|
|
||||||
Node: Pure Calling141782
|
|
||||||
Node: Error Reporting144714
|
|
||||||
Node: Action Features146836
|
|
||||||
Node: Algorithm150131
|
|
||||||
Node: Look-Ahead152424
|
|
||||||
Node: Shift/Reduce154556
|
|
||||||
Node: Precedence157468
|
|
||||||
Node: Why Precedence158119
|
|
||||||
Node: Using Precedence159984
|
|
||||||
Node: Precedence Examples160952
|
|
||||||
Node: How Precedence161653
|
|
||||||
Node: Contextual Precedence162802
|
|
||||||
Node: Parser States164593
|
|
||||||
Node: Reduce/Reduce165836
|
|
||||||
Node: Mystery Conflicts169397
|
|
||||||
Node: Stack Overflow172783
|
|
||||||
Node: Error Recovery174156
|
|
||||||
Node: Context Dependency179292
|
|
||||||
Node: Semantic Tokens180140
|
|
||||||
Node: Lexical Tie-ins183157
|
|
||||||
Node: Tie-in Recovery184705
|
|
||||||
Node: Debugging186877
|
|
||||||
Node: Invocation190178
|
|
||||||
Node: Bison Options191430
|
|
||||||
Node: Environment Variables195398
|
|
||||||
Node: Option Cross Key196246
|
|
||||||
Node: VMS Invocation197124
|
|
||||||
Node: Table of Symbols197908
|
|
||||||
Node: Glossary205547
|
|
||||||
Node: Copying This Manual211851
|
|
||||||
Node: GNU Free Documentation License212060
|
|
||||||
Node: Index231925
|
|
||||||
|
|
||||||
End Tag Table
|
|
||||||
-1076
File diff suppressed because it is too large
Load Diff
-1427
File diff suppressed because it is too large
Load Diff
-1317
File diff suppressed because it is too large
Load Diff
-1261
File diff suppressed because it is too large
Load Diff
-1036
File diff suppressed because it is too large
Load Diff
+235
-183
@@ -447,16 +447,26 @@ lexicography, not grammar.)
|
|||||||
|
|
||||||
Here is a simple C function subdivided into tokens:
|
Here is a simple C function subdivided into tokens:
|
||||||
|
|
||||||
|
@ifinfo
|
||||||
@example
|
@example
|
||||||
int /* @r{keyword `int'} */
|
int /* @r{keyword `int'} */
|
||||||
square (x) /* @r{identifier, open-paren,} */
|
square (int x) /* @r{identifier, open-paren, identifier,}
|
||||||
/* @r{identifier, close-paren} */
|
@r{identifier, close-paren} */
|
||||||
int x; /* @r{keyword `int', identifier, semicolon} */
|
|
||||||
@{ /* @r{open-brace} */
|
@{ /* @r{open-brace} */
|
||||||
return x * x; /* @r{keyword `return', identifier,} */
|
return x * x; /* @r{keyword `return', identifier, asterisk,
|
||||||
/* @r{asterisk, identifier, semicolon} */
|
identifier, semicolon} */
|
||||||
@} /* @r{close-brace} */
|
@} /* @r{close-brace} */
|
||||||
@end example
|
@end example
|
||||||
|
@end ifinfo
|
||||||
|
@ifnotinfo
|
||||||
|
@example
|
||||||
|
int /* @r{keyword `int'} */
|
||||||
|
square (int x) /* @r{identifier, open-paren, identifier, identifier, close-paren} */
|
||||||
|
@{ /* @r{open-brace} */
|
||||||
|
return x * x; /* @r{keyword `return', identifier, asterisk, identifier, semicolon} */
|
||||||
|
@} /* @r{close-brace} */
|
||||||
|
@end example
|
||||||
|
@end ifnotinfo
|
||||||
|
|
||||||
The syntactic groupings of C include the expression, the statement, the
|
The syntactic groupings of C include the expression, the statement, the
|
||||||
declaration, and the function definition. These are represented in the
|
declaration, and the function definition. These are represented in the
|
||||||
@@ -683,7 +693,7 @@ arrange for it to call @code{yyparse} or the parser will never run.
|
|||||||
@xref{Interface, ,Parser C-Language Interface}.
|
@xref{Interface, ,Parser C-Language Interface}.
|
||||||
|
|
||||||
Aside from the token type names and the symbols in the actions you
|
Aside from the token type names and the symbols in the actions you
|
||||||
write, all variable and function names used in the Bison parser file
|
write, all symbols defined in the Bison parser file itself
|
||||||
begin with @samp{yy} or @samp{YY}. This includes interface functions
|
begin with @samp{yy} or @samp{YY}. This includes interface functions
|
||||||
such as the lexical analyzer function @code{yylex}, the error reporting
|
such as the lexical analyzer function @code{yylex}, the error reporting
|
||||||
function @code{yyerror} and the parser function @code{yyparse} itself.
|
function @code{yyerror} and the parser function @code{yyparse} itself.
|
||||||
@@ -692,6 +702,14 @@ Therefore, you should avoid using C identifiers starting with @samp{yy}
|
|||||||
or @samp{YY} in the Bison grammar file except for the ones defined in
|
or @samp{YY} in the Bison grammar file except for the ones defined in
|
||||||
this manual.
|
this manual.
|
||||||
|
|
||||||
|
In some cases the Bison parser file includes system headers, and in
|
||||||
|
those cases your code should respect the identifiers reserved by those
|
||||||
|
headers. On some non-@sc{gnu} hosts, @code{<alloca.h>},
|
||||||
|
@code{<stddef.h>}, and @code{<stdlib.h>} are included as needed to
|
||||||
|
declare memory allocators and related types. On all hosts,
|
||||||
|
@code{<stdio.h>} is included if you define @code{YYDEBUG}
|
||||||
|
(@pxref{Debugging, ,Debugging Your Parser}).
|
||||||
|
|
||||||
@node Stages
|
@node Stages
|
||||||
@section Stages in Using Bison
|
@section Stages in Using Bison
|
||||||
@cindex stages in using Bison
|
@cindex stages in using Bison
|
||||||
@@ -855,11 +873,12 @@ The C declarations section (@pxref{C Declarations, ,The C Declarations Section})
|
|||||||
preprocessor directives.
|
preprocessor directives.
|
||||||
|
|
||||||
The @code{#define} directive defines the macro @code{YYSTYPE}, thus
|
The @code{#define} directive defines the macro @code{YYSTYPE}, thus
|
||||||
specifying the C data type for semantic values of both tokens and groupings
|
specifying the C data type for semantic values of both tokens and
|
||||||
(@pxref{Value Type, ,Data Types of Semantic Values}). The Bison parser will use whatever type
|
groupings (@pxref{Value Type, ,Data Types of Semantic Values}). The
|
||||||
@code{YYSTYPE} is defined as; if you don't define it, @code{int} is the
|
Bison parser will use whatever type @code{YYSTYPE} is defined as; if you
|
||||||
default. Because we specify @code{double}, each token and each expression
|
don't define it, @code{int} is the default. Because we specify
|
||||||
has an associated value, which is a floating point number.
|
@code{double}, each token and each expression has an associated value,
|
||||||
|
which is a floating point number.
|
||||||
|
|
||||||
The @code{#include} directive is used to declare the exponentiation
|
The @code{#include} directive is used to declare the exponentiation
|
||||||
function @code{pow}.
|
function @code{pow}.
|
||||||
@@ -1066,10 +1085,11 @@ token type is an identifier, that identifier is defined by Bison as a C
|
|||||||
macro whose definition is the appropriate number. In this example,
|
macro whose definition is the appropriate number. In this example,
|
||||||
therefore, @code{NUM} becomes a macro for @code{yylex} to use.
|
therefore, @code{NUM} becomes a macro for @code{yylex} to use.
|
||||||
|
|
||||||
The semantic value of the token (if it has one) is stored into the global
|
The semantic value of the token (if it has one) is stored into the
|
||||||
variable @code{yylval}, which is where the Bison parser will look for it.
|
global variable @code{yylval}, which is where the Bison parser will look
|
||||||
(The C data type of @code{yylval} is @code{YYSTYPE}, which was defined
|
for it. (The C data type of @code{yylval} is @code{YYSTYPE}, which was
|
||||||
at the beginning of the grammar; @pxref{Rpcalc Decls, ,Declarations for @code{rpcalc}}.)
|
defined at the beginning of the grammar; @pxref{Rpcalc Decls,
|
||||||
|
,Declarations for @code{rpcalc}}.)
|
||||||
|
|
||||||
A token type code of zero is returned if the end-of-file is encountered.
|
A token type code of zero is returned if the end-of-file is encountered.
|
||||||
(Bison recognizes any nonpositive value as indicating the end of the
|
(Bison recognizes any nonpositive value as indicating the end of the
|
||||||
@@ -1202,19 +1222,19 @@ Here is how to compile and run the parser file:
|
|||||||
@example
|
@example
|
||||||
@group
|
@group
|
||||||
# @r{List files in current directory.}
|
# @r{List files in current directory.}
|
||||||
% ls
|
$ @kbd{ls}
|
||||||
rpcalc.tab.c rpcalc.y
|
rpcalc.tab.c rpcalc.y
|
||||||
@end group
|
@end group
|
||||||
|
|
||||||
@group
|
@group
|
||||||
# @r{Compile the Bison parser.}
|
# @r{Compile the Bison parser.}
|
||||||
# @r{@samp{-lm} tells compiler to search math library for @code{pow}.}
|
# @r{@samp{-lm} tells compiler to search math library for @code{pow}.}
|
||||||
% cc rpcalc.tab.c -lm -o rpcalc
|
$ @kbd{cc rpcalc.tab.c -lm -o rpcalc}
|
||||||
@end group
|
@end group
|
||||||
|
|
||||||
@group
|
@group
|
||||||
# @r{List files again.}
|
# @r{List files again.}
|
||||||
% ls
|
$ @kbd{ls}
|
||||||
rpcalc rpcalc.tab.c rpcalc.y
|
rpcalc rpcalc.tab.c rpcalc.y
|
||||||
@end group
|
@end group
|
||||||
@end example
|
@end example
|
||||||
@@ -1223,19 +1243,19 @@ The file @file{rpcalc} now contains the executable code. Here is an
|
|||||||
example session using @code{rpcalc}.
|
example session using @code{rpcalc}.
|
||||||
|
|
||||||
@example
|
@example
|
||||||
% rpcalc
|
$ @kbd{rpcalc}
|
||||||
4 9 +
|
@kbd{4 9 +}
|
||||||
13
|
13
|
||||||
3 7 + 3 4 5 *+-
|
@kbd{3 7 + 3 4 5 *+-}
|
||||||
-13
|
-13
|
||||||
3 7 + 3 4 5 * + - n @r{Note the unary minus, @samp{n}}
|
@kbd{3 7 + 3 4 5 * + - n} @r{Note the unary minus, @samp{n}}
|
||||||
13
|
13
|
||||||
5 6 / 4 n +
|
@kbd{5 6 / 4 n +}
|
||||||
-3.166666667
|
-3.166666667
|
||||||
3 4 ^ @r{Exponentiation}
|
@kbd{3 4 ^} @r{Exponentiation}
|
||||||
81
|
81
|
||||||
^D @r{End-of-file indicator}
|
@kbd{^D} @r{End-of-file indicator}
|
||||||
%
|
$
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
@node Infix Calc
|
@node Infix Calc
|
||||||
@@ -1315,12 +1335,12 @@ Here is a sample run of @file{calc.y}:
|
|||||||
|
|
||||||
@need 500
|
@need 500
|
||||||
@example
|
@example
|
||||||
% calc
|
$ @kbd{calc}
|
||||||
4 + 4.5 - (34/(8*3+-3))
|
@kbd{4 + 4.5 - (34/(8*3+-3))}
|
||||||
6.880952381
|
6.880952381
|
||||||
-56 + 2
|
@kbd{-56 + 2}
|
||||||
-54
|
-54
|
||||||
3 ^ 2
|
@kbd{3 ^ 2}
|
||||||
9
|
9
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
@@ -1372,13 +1392,11 @@ Bison programs.
|
|||||||
@cindex @code{ltcalc}
|
@cindex @code{ltcalc}
|
||||||
@cindex calculator, location tracking
|
@cindex calculator, location tracking
|
||||||
|
|
||||||
This example extends the infix notation calculator with location tracking.
|
This example extends the infix notation calculator with location
|
||||||
This feature will be used to improve error reporting, and provide better
|
tracking. This feature will be used to improve the error messages. For
|
||||||
error messages.
|
the sake of clarity, this example is a simple integer calculator, since
|
||||||
|
most of the work needed to use locations will be done in the lexical
|
||||||
For the sake of clarity, we will switch for this example to an integer
|
analyser.
|
||||||
calculator, since most of the work needed to use locations will be done
|
|
||||||
in the lexical analyser.
|
|
||||||
|
|
||||||
@menu
|
@menu
|
||||||
* Decls: Ltcalc Decls. Bison and C declarations for ltcalc.
|
* Decls: Ltcalc Decls. Bison and C declarations for ltcalc.
|
||||||
@@ -1389,8 +1407,8 @@ in the lexical analyser.
|
|||||||
@node Ltcalc Decls
|
@node Ltcalc Decls
|
||||||
@subsection Declarations for @code{ltcalc}
|
@subsection Declarations for @code{ltcalc}
|
||||||
|
|
||||||
The C and Bison declarations for the location tracking calculator are the same
|
The C and Bison declarations for the location tracking calculator are
|
||||||
as the declarations for the infix notation calculator.
|
the same as the declarations for the infix notation calculator.
|
||||||
|
|
||||||
@example
|
@example
|
||||||
/* Location tracking calculator. */
|
/* Location tracking calculator. */
|
||||||
@@ -1411,22 +1429,24 @@ as the declarations for the infix notation calculator.
|
|||||||
%% /* Grammar follows */
|
%% /* Grammar follows */
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
In the code above, there are no declarations specific to locations. Defining
|
@noindent
|
||||||
a data type for storing locations is not needed: we will use the type provided
|
Note there are no declarations specific to locations. Defining a data
|
||||||
by default (@pxref{Location Type, ,Data Types of Locations}), which is a four
|
type for storing locations is not needed: we will use the type provided
|
||||||
member structure with the following integer fields: @code{first_line},
|
by default (@pxref{Location Type, ,Data Types of Locations}), which is a
|
||||||
@code{first_column}, @code{last_line} and @code{last_column}.
|
four member structure with the following integer fields:
|
||||||
|
@code{first_line}, @code{first_column}, @code{last_line} and
|
||||||
|
@code{last_column}.
|
||||||
|
|
||||||
@node Ltcalc Rules
|
@node Ltcalc Rules
|
||||||
@subsection Grammar Rules for @code{ltcalc}
|
@subsection Grammar Rules for @code{ltcalc}
|
||||||
|
|
||||||
Whether you choose to handle locations or not has no effect on the syntax of
|
Whether handling locations or not has no effect on the syntax of your
|
||||||
your language. Therefore, grammar rules for this example will be very close to
|
language. Therefore, grammar rules for this example will be very close
|
||||||
those of the previous example: we will only modify them to benefit from the new
|
to those of the previous example: we will only modify them to benefit
|
||||||
informations we will have.
|
from the new information.
|
||||||
|
|
||||||
Here, we will use locations to report divisions by zero, and locate the wrong
|
Here, we will use locations to report divisions by zero, and locate the
|
||||||
expressions or subexpressions.
|
wrong expressions or subexpressions.
|
||||||
|
|
||||||
@example
|
@example
|
||||||
@group
|
@group
|
||||||
@@ -1447,17 +1467,17 @@ exp : NUM @{ $$ = $1; @}
|
|||||||
| exp '-' exp @{ $$ = $1 - $3; @}
|
| exp '-' exp @{ $$ = $1 - $3; @}
|
||||||
| exp '*' exp @{ $$ = $1 * $3; @}
|
| exp '*' exp @{ $$ = $1 * $3; @}
|
||||||
@end group
|
@end group
|
||||||
| exp '/' exp
|
|
||||||
@group
|
@group
|
||||||
|
| exp '/' exp
|
||||||
@{
|
@{
|
||||||
if ($3)
|
if ($3)
|
||||||
$$ = $1 / $3;
|
$$ = $1 / $3;
|
||||||
else
|
else
|
||||||
@{
|
@{
|
||||||
$$ = 1;
|
$$ = 1;
|
||||||
printf("Division by zero, l%d,c%d-l%d,c%d",
|
fprintf (stderr, "%d.%d-%d.%d: division by zero",
|
||||||
@@3.first_line, @@3.first_column,
|
@@3.first_line, @@3.first_column,
|
||||||
@@3.last_line, @@3.last_column);
|
@@3.last_line, @@3.last_column);
|
||||||
@}
|
@}
|
||||||
@}
|
@}
|
||||||
@end group
|
@end group
|
||||||
@@ -1472,25 +1492,24 @@ This code shows how to reach locations inside of semantic actions, by
|
|||||||
using the pseudo-variables @code{@@@var{n}} for rule components, and the
|
using the pseudo-variables @code{@@@var{n}} for rule components, and the
|
||||||
pseudo-variable @code{@@$} for groupings.
|
pseudo-variable @code{@@$} for groupings.
|
||||||
|
|
||||||
In this example, we never assign a value to @code{@@$}, because the
|
We don't need to assign a value to @code{@@$}: the output parser does it
|
||||||
output parser can do this automatically. By default, before executing
|
automatically. By default, before executing the C code of each action,
|
||||||
the C code of each action, @code{@@$} is set to range from the beginning
|
@code{@@$} is set to range from the beginning of @code{@@1} to the end
|
||||||
of @code{@@1} to the end of @code{@@@var{n}}, for a rule with @var{n}
|
of @code{@@@var{n}}, for a rule with @var{n} components. This behavior
|
||||||
components.
|
can be redefined (@pxref{Location Default Action, , Default Action for
|
||||||
|
Locations}), and for very specific rules, @code{@@$} can be computed by
|
||||||
Of course, this behavior can be redefined (@pxref{Location Default
|
hand.
|
||||||
Action, , Default Action for Locations}), and for very specific rules,
|
|
||||||
@code{@@$} can be computed by hand.
|
|
||||||
|
|
||||||
@node Ltcalc Lexer
|
@node Ltcalc Lexer
|
||||||
@subsection The @code{ltcalc} Lexical Analyzer.
|
@subsection The @code{ltcalc} Lexical Analyzer.
|
||||||
|
|
||||||
Until now, we relied on Bison's defaults to enable location tracking. The next
|
Until now, we relied on Bison's defaults to enable location
|
||||||
step is to rewrite the lexical analyser, and make it able to feed the parser
|
tracking. The next step is to rewrite the lexical analyser, and make it
|
||||||
with locations of tokens, as he already does for semantic values.
|
able to feed the parser with the token locations, as it already does for
|
||||||
|
semantic values.
|
||||||
|
|
||||||
To do so, we must take into account every single character of the input text,
|
To this end, we must take into account every single character of the
|
||||||
to avoid the computed locations of being fuzzy or wrong:
|
input text, to avoid the computed locations of being fuzzy or wrong:
|
||||||
|
|
||||||
@example
|
@example
|
||||||
@group
|
@group
|
||||||
@@ -1540,17 +1559,18 @@ yylex (void)
|
|||||||
@}
|
@}
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
Basically, the lexical analyzer does the same processing as before: it skips
|
Basically, the lexical analyzer performs the same processing as before:
|
||||||
blanks and tabs, and reads numbers or single-character tokens. In addition
|
it skips blanks and tabs, and reads numbers or single-character tokens.
|
||||||
to this, it updates the @code{yylloc} global variable (of type @code{YYLTYPE}),
|
In addition, it updates @code{yylloc}, the global variable (of type
|
||||||
where the location of tokens is stored.
|
@code{YYLTYPE}) containing the token's location.
|
||||||
|
|
||||||
Now, each time this function returns a token, the parser has it's number as
|
Now, each time this function returns a token, the parser has its number
|
||||||
well as it's semantic value, and it's position in the text. The last needed
|
as well as its semantic value, and its location in the text. The last
|
||||||
change is to initialize @code{yylloc}, for example in the controlling
|
needed change is to initialize @code{yylloc}, for example in the
|
||||||
function:
|
controlling function:
|
||||||
|
|
||||||
@example
|
@example
|
||||||
|
@group
|
||||||
int
|
int
|
||||||
main (void)
|
main (void)
|
||||||
@{
|
@{
|
||||||
@@ -1558,11 +1578,12 @@ main (void)
|
|||||||
yylloc.first_column = yylloc.last_column = 0;
|
yylloc.first_column = yylloc.last_column = 0;
|
||||||
return yyparse ();
|
return yyparse ();
|
||||||
@}
|
@}
|
||||||
|
@end group
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
Remember that computing locations is not a matter of syntax. Every character
|
Remember that computing locations is not a matter of syntax. Every
|
||||||
must be associated to a location update, whether it is in valid input, in
|
character must be associated to a location update, whether it is in
|
||||||
comments, in literal strings, and so on...
|
valid input, in comments, in literal strings, and so on.
|
||||||
|
|
||||||
@node Multi-function Calc
|
@node Multi-function Calc
|
||||||
@section Multi-Function Calculator: @code{mfcalc}
|
@section Multi-Function Calculator: @code{mfcalc}
|
||||||
@@ -1592,20 +1613,20 @@ to create named variables, store values in them, and use them later.
|
|||||||
Here is a sample session with the multi-function calculator:
|
Here is a sample session with the multi-function calculator:
|
||||||
|
|
||||||
@example
|
@example
|
||||||
% mfcalc
|
$ @kbd{mfcalc}
|
||||||
pi = 3.141592653589
|
@kbd{pi = 3.141592653589}
|
||||||
3.1415926536
|
3.1415926536
|
||||||
sin(pi)
|
@kbd{sin(pi)}
|
||||||
0.0000000000
|
0.0000000000
|
||||||
alpha = beta1 = 2.3
|
@kbd{alpha = beta1 = 2.3}
|
||||||
2.3000000000
|
2.3000000000
|
||||||
alpha
|
@kbd{alpha}
|
||||||
2.3000000000
|
2.3000000000
|
||||||
ln(alpha)
|
@kbd{ln(alpha)}
|
||||||
0.8329091229
|
0.8329091229
|
||||||
exp(ln(beta1))
|
@kbd{exp(ln(beta1))}
|
||||||
2.3000000000
|
2.3000000000
|
||||||
%
|
$
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
Note that multiple assignment and nested function calls are permitted.
|
Note that multiple assignment and nested function calls are permitted.
|
||||||
@@ -2374,7 +2395,8 @@ the numbers associated with @var{x} and @var{y}.
|
|||||||
|
|
||||||
In a simple program it may be sufficient to use the same data type for
|
In a simple program it may be sufficient to use the same data type for
|
||||||
the semantic values of all language constructs. This was true in the
|
the semantic values of all language constructs. This was true in the
|
||||||
RPN and infix calculator examples (@pxref{RPN Calc, ,Reverse Polish Notation Calculator}).
|
RPN and infix calculator examples (@pxref{RPN Calc, ,Reverse Polish
|
||||||
|
Notation Calculator}).
|
||||||
|
|
||||||
Bison's default is to use type @code{int} for all semantic values. To
|
Bison's default is to use type @code{int} for all semantic values. To
|
||||||
specify some other type, define @code{YYSTYPE} as a macro, like this:
|
specify some other type, define @code{YYSTYPE} as a macro, like this:
|
||||||
@@ -3067,11 +3089,11 @@ terminal symbol. All kinds of token declarations allow
|
|||||||
@findex %expect
|
@findex %expect
|
||||||
|
|
||||||
Bison normally warns if there are any conflicts in the grammar
|
Bison normally warns if there are any conflicts in the grammar
|
||||||
(@pxref{Shift/Reduce, ,Shift/Reduce Conflicts}), but most real grammars have harmless shift/reduce
|
(@pxref{Shift/Reduce, ,Shift/Reduce Conflicts}), but most real grammars
|
||||||
conflicts which are resolved in a predictable way and would be difficult to
|
have harmless shift/reduce conflicts which are resolved in a predictable
|
||||||
eliminate. It is desirable to suppress the warning about these conflicts
|
way and would be difficult to eliminate. It is desirable to suppress
|
||||||
unless the number of conflicts changes. You can do this with the
|
the warning about these conflicts unless the number of conflicts
|
||||||
@code{%expect} declaration.
|
changes. You can do this with the @code{%expect} declaration.
|
||||||
|
|
||||||
The declaration looks like this:
|
The declaration looks like this:
|
||||||
|
|
||||||
@@ -3079,10 +3101,11 @@ The declaration looks like this:
|
|||||||
%expect @var{n}
|
%expect @var{n}
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
Here @var{n} is a decimal integer. The declaration says there should be no
|
Here @var{n} is a decimal integer. The declaration says there should be
|
||||||
warning if there are @var{n} shift/reduce conflicts and no reduce/reduce
|
no warning if there are @var{n} shift/reduce conflicts and no
|
||||||
conflicts. The usual warning is given if there are either more or fewer
|
reduce/reduce conflicts. An error, instead of the usual warning, is
|
||||||
conflicts, or if there are any reduce/reduce conflicts.
|
given if there are either more or fewer conflicts, or if there are any
|
||||||
|
reduce/reduce conflicts.
|
||||||
|
|
||||||
In general, using @code{%expect} involves these steps:
|
In general, using @code{%expect} involves these steps:
|
||||||
|
|
||||||
@@ -3167,7 +3190,7 @@ valid grammar.
|
|||||||
@cindex declaration summary
|
@cindex declaration summary
|
||||||
@cindex summary, Bison declaration
|
@cindex summary, Bison declaration
|
||||||
|
|
||||||
Here is a summary of all Bison declarations:
|
Here is a summary of the declarations used to define a grammar:
|
||||||
|
|
||||||
@table @code
|
@table @code
|
||||||
@item %union
|
@item %union
|
||||||
@@ -3202,40 +3225,14 @@ Start-Symbol}).
|
|||||||
@item %expect
|
@item %expect
|
||||||
Declare the expected number of shift-reduce conflicts
|
Declare the expected number of shift-reduce conflicts
|
||||||
(@pxref{Expect Decl, ,Suppressing Conflict Warnings}).
|
(@pxref{Expect Decl, ,Suppressing Conflict Warnings}).
|
||||||
|
@end table
|
||||||
|
|
||||||
@item %yacc
|
@sp 1
|
||||||
@itemx %fixed_output_files
|
@noindent
|
||||||
Pretend the option @option{--yacc} was given, i.e., imitate Yacc,
|
In order to change the behavior of @command{bison}, use the following
|
||||||
including its naming conventions. @xref{Bison Options}, for more.
|
directives:
|
||||||
|
|
||||||
@item %locations
|
|
||||||
Generate the code processing the locations (@pxref{Action Features,
|
|
||||||
,Special Features for Use in Actions}). This mode is enabled as soon as
|
|
||||||
the grammar uses the special @samp{@@@var{n}} tokens, but if your
|
|
||||||
grammar does not use it, using @samp{%locations} allows for more
|
|
||||||
accurate parse error messages.
|
|
||||||
|
|
||||||
@item %pure_parser
|
|
||||||
Request a pure (reentrant) parser program (@pxref{Pure Decl, ,A Pure
|
|
||||||
(Reentrant) Parser}).
|
|
||||||
|
|
||||||
@item %no_parser
|
|
||||||
Do not include any C code in the parser file; generate tables only. The
|
|
||||||
parser file contains just @code{#define} directives and static variable
|
|
||||||
declarations.
|
|
||||||
|
|
||||||
This option also tells Bison to write the C code for the grammar actions
|
|
||||||
into a file named @file{@var{filename}.act}, in the form of a
|
|
||||||
brace-surrounded body fit for a @code{switch} statement.
|
|
||||||
|
|
||||||
@item %no_lines
|
|
||||||
Don't generate any @code{#line} preprocessor commands in the parser
|
|
||||||
file. Ordinarily Bison writes these commands in the parser file so that
|
|
||||||
the C compiler and debuggers will associate errors and object code with
|
|
||||||
your source file (the grammar file). This directive causes them to
|
|
||||||
associate errors with the parser file, treating it an independent source
|
|
||||||
file in its own right.
|
|
||||||
|
|
||||||
|
@table @code
|
||||||
@item %debug
|
@item %debug
|
||||||
Output a definition of the macro @code{YYDEBUG} into the parser file, so
|
Output a definition of the macro @code{YYDEBUG} into the parser file, so
|
||||||
that the debugging facilities are compiled. @xref{Debugging, ,Debugging
|
that the debugging facilities are compiled. @xref{Debugging, ,Debugging
|
||||||
@@ -3254,35 +3251,64 @@ This output file is essential if you wish to put the definition of
|
|||||||
be able to refer to token type codes and the variable
|
be able to refer to token type codes and the variable
|
||||||
@code{yylval}. @xref{Token Values, ,Semantic Values of Tokens}.@refill
|
@code{yylval}. @xref{Token Values, ,Semantic Values of Tokens}.@refill
|
||||||
|
|
||||||
|
@item %file-prefix="@var{prefix}"
|
||||||
|
Specify a prefix to use for all Bison output file names. The names are
|
||||||
|
chosen as if the input file were named @file{@var{prefix}.y}.
|
||||||
|
|
||||||
|
@c @item %header_extension
|
||||||
|
@c Specify the extension of the parser header file generated when
|
||||||
|
@c @code{%define} or @samp{-d} are used.
|
||||||
|
@c
|
||||||
|
@c For example, a grammar file named @file{foo.ypp} and containing a
|
||||||
|
@c @code{%header_extension .hh} directive will produce a header file
|
||||||
|
@c named @file{foo.tab.hh}
|
||||||
|
|
||||||
|
@item %locations
|
||||||
|
Generate the code processing the locations (@pxref{Action Features,
|
||||||
|
,Special Features for Use in Actions}). This mode is enabled as soon as
|
||||||
|
the grammar uses the special @samp{@@@var{n}} tokens, but if your
|
||||||
|
grammar does not use it, using @samp{%locations} allows for more
|
||||||
|
accurate parse error messages.
|
||||||
|
|
||||||
|
@item %name-prefix="@var{prefix}"
|
||||||
|
Rename the external symbols used in the parser so that they start with
|
||||||
|
@var{prefix} instead of @samp{yy}. The precise list of symbols renamed
|
||||||
|
is @code{yyparse}, @code{yylex}, @code{yyerror}, @code{yynerrs},
|
||||||
|
@code{yylval}, @code{yychar} and @code{yydebug}. For example, if you
|
||||||
|
use @samp{%name-prefix="c_"}, the names become @code{c_parse},
|
||||||
|
@code{c_lex}, and so on. @xref{Multiple Parsers, ,Multiple Parsers in
|
||||||
|
the Same Program}.
|
||||||
|
|
||||||
|
@item %no-parser
|
||||||
|
Do not include any C code in the parser file; generate tables only. The
|
||||||
|
parser file contains just @code{#define} directives and static variable
|
||||||
|
declarations.
|
||||||
|
|
||||||
|
This option also tells Bison to write the C code for the grammar actions
|
||||||
|
into a file named @file{@var{filename}.act}, in the form of a
|
||||||
|
brace-surrounded body fit for a @code{switch} statement.
|
||||||
|
|
||||||
|
@item %no-lines
|
||||||
|
Don't generate any @code{#line} preprocessor commands in the parser
|
||||||
|
file. Ordinarily Bison writes these commands in the parser file so that
|
||||||
|
the C compiler and debuggers will associate errors and object code with
|
||||||
|
your source file (the grammar file). This directive causes them to
|
||||||
|
associate errors with the parser file, treating it an independent source
|
||||||
|
file in its own right.
|
||||||
|
|
||||||
|
@item %output="@var{filename}"
|
||||||
|
Specify the @var{filename} for the parser file.
|
||||||
|
|
||||||
|
@item %pure-parser
|
||||||
|
Request a pure (reentrant) parser program (@pxref{Pure Decl, ,A Pure
|
||||||
|
(Reentrant) Parser}).
|
||||||
|
|
||||||
@c @item %source_extension
|
@c @item %source_extension
|
||||||
@c Specify the extension of the parser output file.
|
@c Specify the extension of the parser output file.
|
||||||
@c
|
@c
|
||||||
@c For example, a grammar file named @file{foo.yy} and containing a
|
@c For example, a grammar file named @file{foo.yy} and containing a
|
||||||
@c @code{%source_extension .cpp} directive will produce a parser file
|
@c @code{%source_extension .cpp} directive will produce a parser file
|
||||||
@c named @file{foo.tab.cpp}
|
@c named @file{foo.tab.cpp}
|
||||||
@c
|
|
||||||
@c @item %header_extension
|
|
||||||
@c Specify the extension of the parser header file generated when
|
|
||||||
@c @code{%define} or @samp{-d} are used.
|
|
||||||
@c
|
|
||||||
@c For example, a garmmar file named @file{foo.ypp} and containing a
|
|
||||||
@c @code{%header_extension .hh} directive will produce a header file
|
|
||||||
@c named @file{foo.tab.hh}
|
|
||||||
|
|
||||||
@item %verbose
|
|
||||||
Write an extra output file containing verbose descriptions of the
|
|
||||||
parser states and what is done for each type of look-ahead token in
|
|
||||||
that state.
|
|
||||||
|
|
||||||
This file also describes all the conflicts, both those resolved by
|
|
||||||
operator precedence and the unresolved ones.
|
|
||||||
|
|
||||||
The file's name is made by removing @samp{.tab.c} or @samp{.c} from
|
|
||||||
the parser output file name, and adding @samp{.output} instead.@refill
|
|
||||||
|
|
||||||
Therefore, if the input file is @file{foo.y}, then the parser file is
|
|
||||||
called @file{foo.tab.c} by default. As a consequence, the verbose
|
|
||||||
output file is called @file{foo.output}.@refill
|
|
||||||
|
|
||||||
@item %token_table
|
@item %token_table
|
||||||
Generate an array of token names in the parser file. The name of the
|
Generate an array of token names in the parser file. The name of the
|
||||||
@@ -3316,8 +3342,31 @@ The number of grammar rules,
|
|||||||
@item YYNSTATES
|
@item YYNSTATES
|
||||||
The number of parser states (@pxref{Parser States}).
|
The number of parser states (@pxref{Parser States}).
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
|
@item %verbose
|
||||||
|
Write an extra output file containing verbose descriptions of the
|
||||||
|
parser states and what is done for each type of look-ahead token in
|
||||||
|
that state.
|
||||||
|
|
||||||
|
This file also describes all the conflicts, both those resolved by
|
||||||
|
operator precedence and the unresolved ones.
|
||||||
|
|
||||||
|
The file's name is made by removing @samp{.tab.c} or @samp{.c} from
|
||||||
|
the parser output file name, and adding @samp{.output} instead.@refill
|
||||||
|
|
||||||
|
Therefore, if the input file is @file{foo.y}, then the parser file is
|
||||||
|
called @file{foo.tab.c} by default. As a consequence, the verbose
|
||||||
|
output file is called @file{foo.output}.@refill
|
||||||
|
|
||||||
|
@item %yacc
|
||||||
|
@itemx %fixed-output-files
|
||||||
|
Pretend the option @option{--yacc} was given, i.e., imitate Yacc,
|
||||||
|
including its naming conventions. @xref{Bison Options}, for more.
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@node Multiple Parsers
|
@node Multiple Parsers
|
||||||
@section Multiple Parsers in the Same Program
|
@section Multiple Parsers in the Same Program
|
||||||
|
|
||||||
@@ -5049,19 +5098,12 @@ that the debugging facilities are compiled. @xref{Debugging, ,Debugging
|
|||||||
Your Parser}.
|
Your Parser}.
|
||||||
|
|
||||||
@item --locations
|
@item --locations
|
||||||
Pretend that @code{%locactions} was specified. @xref{Decl Summary}.
|
Pretend that @code{%locations} was specified. @xref{Decl Summary}.
|
||||||
|
|
||||||
@item -p @var{prefix}
|
@item -p @var{prefix}
|
||||||
@itemx --name-prefix=@var{prefix}
|
@itemx --name-prefix=@var{prefix}
|
||||||
Rename the external symbols used in the parser so that they start with
|
Pretend that @code{%name-prefix="@var{prefix}"} was specified.
|
||||||
@var{prefix} instead of @samp{yy}. The precise list of symbols renamed
|
@xref{Decl Summary}.
|
||||||
is @code{yyparse}, @code{yylex}, @code{yyerror}, @code{yynerrs},
|
|
||||||
@code{yylval}, @code{yychar} and @code{yydebug}.
|
|
||||||
|
|
||||||
For example, if you use @samp{-p c}, the names become @code{cparse},
|
|
||||||
@code{clex}, and so on.
|
|
||||||
|
|
||||||
@xref{Multiple Parsers, ,Multiple Parsers in the Same Program}.
|
|
||||||
|
|
||||||
@item -l
|
@item -l
|
||||||
@itemx --no-lines
|
@itemx --no-lines
|
||||||
@@ -5073,11 +5115,11 @@ parser file, treating it as an independent source file in its own right.
|
|||||||
|
|
||||||
@item -n
|
@item -n
|
||||||
@itemx --no-parser
|
@itemx --no-parser
|
||||||
Pretend that @code{%no_parser} was specified. @xref{Decl Summary}.
|
Pretend that @code{%no-parser} was specified. @xref{Decl Summary}.
|
||||||
|
|
||||||
@item -k
|
@item -k
|
||||||
@itemx --token-table
|
@itemx --token-table
|
||||||
Pretend that @code{%token_table} was specified. @xref{Decl Summary}.
|
Pretend that @code{%token-table} was specified. @xref{Decl Summary}.
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
@noindent
|
@noindent
|
||||||
@@ -5085,33 +5127,32 @@ Adjust the output:
|
|||||||
|
|
||||||
@table @option
|
@table @option
|
||||||
@item -d
|
@item -d
|
||||||
Pretend that @code{%verbose} was specified, i.e., write an extra output
|
@itemx --defines
|
||||||
|
Pretend that @code{%defines} was specified, i.e., write an extra output
|
||||||
file containing macro definitions for the token type names defined in
|
file containing macro definitions for the token type names defined in
|
||||||
the grammar and the semantic value type @code{YYSTYPE}, as well as a few
|
the grammar and the semantic value type @code{YYSTYPE}, as well as a few
|
||||||
@code{extern} variable declarations. @xref{Decl Summary}.
|
@code{extern} variable declarations. @xref{Decl Summary}.
|
||||||
|
|
||||||
@item --defines=@var{defines-file}
|
@item --defines=@var{defines-file}
|
||||||
The behaviour of @var{--defines} is the same than @samp{-d}. The only
|
Same as above, but save in the file @var{defines-file}.
|
||||||
difference is that it has an optionnal argument which is the name of
|
|
||||||
the output filename.
|
|
||||||
|
|
||||||
@item -b @var{file-prefix}
|
@item -b @var{file-prefix}
|
||||||
@itemx --file-prefix=@var{prefix}
|
@itemx --file-prefix=@var{prefix}
|
||||||
Specify a prefix to use for all Bison output file names. The names are
|
Pretend that @code{%verbose} was specified, i.e, specify prefix to use
|
||||||
chosen as if the input file were named @file{@var{prefix}.c}.
|
for all Bison output file names. @xref{Decl Summary}.
|
||||||
|
|
||||||
@item -v
|
@item -v
|
||||||
@itemx --verbose
|
@itemx --verbose
|
||||||
Pretend that @code{%verbose} was specified, i.e, write an extra output
|
Pretend that @code{%verbose} was specified, i.e, write an extra output
|
||||||
file containing verbose descriptions of the grammar and
|
file containing verbose descriptions of the grammar and
|
||||||
parser. @xref{Decl Summary}, for more.
|
parser. @xref{Decl Summary}.
|
||||||
|
|
||||||
@item -o @var{outfile}
|
@item -o @var{filename}
|
||||||
@itemx --output-file=@var{outfile}
|
@itemx --output=@var{filename}
|
||||||
Specify the name @var{outfile} for the parser file.
|
Specify the @var{filename} for the parser file.
|
||||||
|
|
||||||
The other output files' names are constructed from @var{outfile}
|
The other output files' names are constructed from @var{filename} as
|
||||||
as described under the @samp{-v} and @samp{-d} options.
|
described under the @samp{-v} and @samp{-d} options.
|
||||||
|
|
||||||
@item -g
|
@item -g
|
||||||
Output a VCG definition of the LALR(1) grammar automaton computed by
|
Output a VCG definition of the LALR(1) grammar automaton computed by
|
||||||
@@ -5119,7 +5160,7 @@ Bison. If the grammar file is @file{foo.y}, the VCG output file will
|
|||||||
be @file{foo.vcg}.
|
be @file{foo.vcg}.
|
||||||
|
|
||||||
@item --graph=@var{graph-file}
|
@item --graph=@var{graph-file}
|
||||||
The behaviour of @var{--graph} is the same than @samp{-g}. The only
|
The behaviour of @var{--graph} is the same than @samp{-g}. The only
|
||||||
difference is that it has an optionnal argument which is the name of
|
difference is that it has an optionnal argument which is the name of
|
||||||
the output graph filename.
|
the output graph filename.
|
||||||
@end table
|
@end table
|
||||||
@@ -5168,7 +5209,7 @@ the corresponding short option.
|
|||||||
\line{ --name-prefix \leaderfill -p}
|
\line{ --name-prefix \leaderfill -p}
|
||||||
\line{ --no-lines \leaderfill -l}
|
\line{ --no-lines \leaderfill -l}
|
||||||
\line{ --no-parser \leaderfill -n}
|
\line{ --no-parser \leaderfill -n}
|
||||||
\line{ --output-file \leaderfill -o}
|
\line{ --output \leaderfill -o}
|
||||||
\line{ --token-table \leaderfill -k}
|
\line{ --token-table \leaderfill -k}
|
||||||
\line{ --verbose \leaderfill -v}
|
\line{ --verbose \leaderfill -v}
|
||||||
\line{ --version \leaderfill -V}
|
\line{ --version \leaderfill -V}
|
||||||
@@ -5187,7 +5228,7 @@ the corresponding short option.
|
|||||||
--name-prefix=@var{prefix} -p @var{name-prefix}
|
--name-prefix=@var{prefix} -p @var{name-prefix}
|
||||||
--no-lines -l
|
--no-lines -l
|
||||||
--no-parser -n
|
--no-parser -n
|
||||||
--output-file=@var{outfile} -o @var{outfile}
|
--output=@var{outfile} -o @var{outfile}
|
||||||
--token-table -k
|
--token-table -k
|
||||||
--verbose -v
|
--verbose -v
|
||||||
--version -V
|
--version -V
|
||||||
@@ -5361,6 +5402,10 @@ Equip the parser for debugging. @xref{Decl Summary}.
|
|||||||
Bison declaration to create a header file meant for the scanner.
|
Bison declaration to create a header file meant for the scanner.
|
||||||
@xref{Decl Summary}.
|
@xref{Decl Summary}.
|
||||||
|
|
||||||
|
@item %file-prefix="@var{prefix}"
|
||||||
|
Bison declaration to set tge prefix of the output files. @xref{Decl
|
||||||
|
Summary}.
|
||||||
|
|
||||||
@c @item %source_extension
|
@c @item %source_extension
|
||||||
@c Bison declaration to specify the generated parser output file extension.
|
@c Bison declaration to specify the generated parser output file extension.
|
||||||
@c @xref{Decl Summary}.
|
@c @xref{Decl Summary}.
|
||||||
@@ -5373,7 +5418,10 @@ Bison declaration to create a header file meant for the scanner.
|
|||||||
Bison declaration to assign left associativity to token(s).
|
Bison declaration to assign left associativity to token(s).
|
||||||
@xref{Precedence Decl, ,Operator Precedence}.
|
@xref{Precedence Decl, ,Operator Precedence}.
|
||||||
|
|
||||||
@item %no_lines
|
@item %name-prefix="@var{prefix}"
|
||||||
|
Bison declaration to rename the external symbols. @xref{Decl Summary}.
|
||||||
|
|
||||||
|
@item %no-lines
|
||||||
Bison declaration to avoid generating @code{#line} directives in the
|
Bison declaration to avoid generating @code{#line} directives in the
|
||||||
parser file. @xref{Decl Summary}.
|
parser file. @xref{Decl Summary}.
|
||||||
|
|
||||||
@@ -5381,11 +5429,15 @@ parser file. @xref{Decl Summary}.
|
|||||||
Bison declaration to assign non-associativity to token(s).
|
Bison declaration to assign non-associativity to token(s).
|
||||||
@xref{Precedence Decl, ,Operator Precedence}.
|
@xref{Precedence Decl, ,Operator Precedence}.
|
||||||
|
|
||||||
|
@item %output="@var{filename}"
|
||||||
|
Bison declaration to set the name of the parser file. @xref{Decl
|
||||||
|
Summary}.
|
||||||
|
|
||||||
@item %prec
|
@item %prec
|
||||||
Bison declaration to assign a precedence to a specific rule.
|
Bison declaration to assign a precedence to a specific rule.
|
||||||
@xref{Contextual Precedence, ,Context-Dependent Precedence}.
|
@xref{Contextual Precedence, ,Context-Dependent Precedence}.
|
||||||
|
|
||||||
@item %pure_parser
|
@item %pure-parser
|
||||||
Bison declaration to request a pure (reentrant) parser.
|
Bison declaration to request a pure (reentrant) parser.
|
||||||
@xref{Pure Decl, ,A Pure (Reentrant) Parser}.
|
@xref{Pure Decl, ,A Pure (Reentrant) Parser}.
|
||||||
|
|
||||||
@@ -5400,7 +5452,7 @@ Bison declaration to specify the start symbol. @xref{Start Decl, ,The Start-Sym
|
|||||||
Bison declaration to declare token(s) without specifying precedence.
|
Bison declaration to declare token(s) without specifying precedence.
|
||||||
@xref{Token Decl, ,Token Type Names}.
|
@xref{Token Decl, ,Token Type Names}.
|
||||||
|
|
||||||
@item %token_table
|
@item %token-table
|
||||||
Bison declaration to include a token name table in the parser file.
|
Bison declaration to include a token name table in the parser file.
|
||||||
@xref{Decl Summary}.
|
@xref{Decl Summary}.
|
||||||
|
|
||||||
|
|||||||
+44
-38
@@ -6,7 +6,7 @@
|
|||||||
% This file can be printed with 1 or 2 columns per page (see below).
|
% This file can be printed with 1 or 2 columns per page (see below).
|
||||||
% Specify how many you want here. Nothing else needs to be changed
|
% Specify how many you want here. Nothing else needs to be changed
|
||||||
% unless you are maintaining the documentation.
|
% unless you are maintaining the documentation.
|
||||||
% For printing reference cards to use in books, specify one column
|
% For printing reference cards to use in books, specify one column
|
||||||
% per page and reduce to 80%.
|
% per page and reduce to 80%.
|
||||||
% Note that if columnsperpage is set to 2, there will be a few overfull
|
% Note that if columnsperpage is set to 2, there will be a few overfull
|
||||||
% boxes, but they are not serious. Just uncomment \finalout.
|
% boxes, but they are not serious. Just uncomment \finalout.
|
||||||
@@ -19,7 +19,7 @@
|
|||||||
\def\finalout{\overfullrule=0pt}
|
\def\finalout{\overfullrule=0pt}
|
||||||
%\finalout
|
%\finalout
|
||||||
|
|
||||||
% Copyright (c) 1998 Free Software Foundation, Inc.
|
% Copyright (c) 1998, 2001 Free Software Foundation, Inc.
|
||||||
%
|
%
|
||||||
% This file is part of Bison.
|
% This file is part of Bison.
|
||||||
%
|
%
|
||||||
@@ -51,11 +51,11 @@
|
|||||||
% Which mode to use is controlled by setting \columnsperpage above.
|
% Which mode to use is controlled by setting \columnsperpage above.
|
||||||
%
|
%
|
||||||
% Authors:
|
% Authors:
|
||||||
% Brendan Kehoe
|
% Brendan Kehoe
|
||||||
% UUCP: widener!brendan
|
% UUCP: widener!brendan
|
||||||
% Internet: [email protected]
|
% Internet: [email protected]
|
||||||
%
|
%
|
||||||
% Gavin Nicol
|
% Gavin Nicol
|
||||||
% Internet: [email protected]
|
% Internet: [email protected]
|
||||||
%
|
%
|
||||||
% This refcard format was created by Steve Gildea.
|
% This refcard format was created by Steve Gildea.
|
||||||
@@ -66,12 +66,12 @@
|
|||||||
% We only change the following to change the version numbers and
|
% We only change the following to change the version numbers and
|
||||||
% such.
|
% such.
|
||||||
|
|
||||||
\def\bisonversion{1.20} % the bison version
|
\def\bisonversion{1.31} % the bison version
|
||||||
|
|
||||||
\def\refcardversion{0.4a} % reference card version
|
\def\refcardversion{0.5} % reference card version
|
||||||
\def\month{August} % month
|
\def\month{November} % month
|
||||||
\def\year{1998} % year
|
\def\year{2001} % year
|
||||||
\def\version{\month\ \year, Bison Refcard Version \refcardversion}
|
\def\version{\month\ \year, Bison Refcard Version \refcardversion}
|
||||||
|
|
||||||
% for copyright notices
|
% for copyright notices
|
||||||
\def\small{\smallfont\textfont2=\smallsy\baselineskip=.8\baselineskip}
|
\def\small{\smallfont\textfont2=\smallsy\baselineskip=.8\baselineskip}
|
||||||
@@ -90,7 +90,7 @@
|
|||||||
|
|
||||||
Permission is granted to make and distribute copies of this card
|
Permission is granted to make and distribute copies of this card
|
||||||
provided the copyright notice and this permission notice
|
provided the copyright notice and this permission notice
|
||||||
are preserved on all copies.
|
are preserved on all copies.
|
||||||
\vskip .2\baselineskip
|
\vskip .2\baselineskip
|
||||||
For information, write to the:
|
For information, write to the:
|
||||||
\vskip .2\baselineskip
|
\vskip .2\baselineskip
|
||||||
@@ -115,7 +115,7 @@ For information, write to the:
|
|||||||
|
|
||||||
Permission is granted to make and distribute copies of this card
|
Permission is granted to make and distribute copies of this card
|
||||||
provided the copyright notice and this permission notice
|
provided the copyright notice and this permission notice
|
||||||
are preserved on all copies.
|
are preserved on all copies.
|
||||||
\vskip .2\baselineskip
|
\vskip .2\baselineskip
|
||||||
For information, write to the:
|
For information, write to the:
|
||||||
\vskip .2\baselineskip
|
\vskip .2\baselineskip
|
||||||
@@ -136,7 +136,7 @@ For information, write to the:
|
|||||||
|
|
||||||
\def\ncolumns{\the\columnsperpage}
|
\def\ncolumns{\the\columnsperpage}
|
||||||
|
|
||||||
\message{[\ncolumns\space
|
\message{[\ncolumns\space
|
||||||
column\if 1\ncolumns\else s\fi\space per page]}
|
column\if 1\ncolumns\else s\fi\space per page]}
|
||||||
|
|
||||||
\def\scaledmag#1{ scaled \magstep #1}
|
\def\scaledmag#1{ scaled \magstep #1}
|
||||||
@@ -227,7 +227,7 @@ For information, write to the:
|
|||||||
\def\bye{\par\vfill\supereject
|
\def\bye{\par\vfill\supereject
|
||||||
\if a\abc \else\null\vfill\eject\fi
|
\if a\abc \else\null\vfill\eject\fi
|
||||||
\if a\abc \else\null\vfill\eject\fi
|
\if a\abc \else\null\vfill\eject\fi
|
||||||
\end}
|
\end}
|
||||||
\fi
|
\fi
|
||||||
|
|
||||||
% we won't be using math mode much, so redefine some of the characters
|
% we won't be using math mode much, so redefine some of the characters
|
||||||
@@ -316,41 +316,44 @@ Options can be used as: \kbd{bison {\it options} {\it filename}}
|
|||||||
\section{Command Line Options}
|
\section{Command Line Options}
|
||||||
%*****************************
|
%*****************************
|
||||||
|
|
||||||
|
\key{Display usage information.} {-h}
|
||||||
|
\key{Display version information.} {-V}
|
||||||
\key{Generate token and {\tt YYSTYPE} definitions.} {-d}
|
\key{Generate token and {\tt YYSTYPE} definitions.} {-d}
|
||||||
|
\key{Prepend a prefix to external symbols.} {-p {\it prefix}}
|
||||||
\key{Don't put {\tt \#line} directives in the parser.} {-l}
|
\key{Don't put {\tt \#line} directives in the parser.} {-l}
|
||||||
\key{Specify the output file.} {-o {\it filename}}
|
\key{Specify the output file.} {-o {\it filename}}
|
||||||
\key{Debug or {\it trace} mode.} {-t}
|
\key{Debug or {\it trace} mode.} {-t}
|
||||||
\key{Verbose description of the parser.} {-v}
|
\key{Verbose description of the parser.} {-v}
|
||||||
\key{Emulate {\tt yacc} (generate {\tt y.tab.*} files).} {-y}
|
\key{Emulate {\tt yacc} (generate {\tt y.tab.*} files).} {-y}
|
||||||
|
|
||||||
\vskip .10truein
|
\vskip .10truein
|
||||||
{\bf Note:} The token and {\tt YYSTYPE} definitions are generated
|
{\bf Note:} The token and {\tt YYSTYPE} definitions are generated
|
||||||
to a file called {\tt y.tab.h} if the {\tt -y} option is used,
|
to a file called {\tt y.tab.h} if the {\tt -y} option is used,
|
||||||
otherwise it will have the format {\tt {\it name}.tab.h}, where
|
otherwise it will have the format {\tt {\it name}.tab.h}, where
|
||||||
{\it name} is the leading part of the parser definition filename.
|
{\it name} is the leading part of the parser definition filename.
|
||||||
|
|
||||||
\section{Definitions}
|
\section{Definitions}
|
||||||
%********************
|
%********************
|
||||||
|
|
||||||
\key{Declare a terminal symbol.}{\%token <{\it t\/}>
|
\key{Declare a terminal symbol.}{\%token <{\it t\/}>
|
||||||
{\it n}}
|
{\it n}}
|
||||||
|
|
||||||
\key{Declare a terminal symbol, and define its association.}
|
\key{Declare a terminal symbol, and define its association.}
|
||||||
{{\it association} <{\it t\/}> {\it n}}
|
{{\it association} <{\it t\/}> {\it n}}
|
||||||
|
|
||||||
\vskip .2\baselineskip
|
\vskip .2\baselineskip
|
||||||
\key{Generate a reentrant (pure) parser.}
|
\key{Generate a reentrant (pure) parser.}
|
||||||
{\%pure_parser}
|
{\%pure_parser}
|
||||||
|
|
||||||
\key{Define the union of all data types used in the parser.}
|
\key{Define the union of all data types used in the parser.}
|
||||||
{\%union\{{\it field list}\} }
|
{\%union\{{\it field list}\} }
|
||||||
|
|
||||||
\vskip .2\baselineskip
|
\vskip .2\baselineskip
|
||||||
\key{Tell {\tt bison} where to start parsing.}
|
\key{Tell {\tt bison} where to start parsing.}
|
||||||
{\%start {\it m}}
|
{\%start {\it m}}
|
||||||
|
|
||||||
\key{Tell {\tt bison} the data type of symbols.}
|
\key{Tell {\tt bison} the data type of symbols.}
|
||||||
{\%type <{\it t\/}> {\it s1}\dots{\it sn}}
|
{\%type <{\it t\/}> {\it s1}\dots{\it sn}}
|
||||||
|
|
||||||
\vskip .10truein
|
\vskip .10truein
|
||||||
|
|
||||||
@@ -362,8 +365,8 @@ definition, {\it n} is a {\it terminal} symbol name, {\it m} is a
|
|||||||
\vskip .10truein
|
\vskip .10truein
|
||||||
|
|
||||||
The {\tt <{\it t\/}>} after {\tt \%token, \%left, \%right} and {\tt
|
The {\tt <{\it t\/}>} after {\tt \%token, \%left, \%right} and {\tt
|
||||||
\%nonassoc} is optional. Additionally, precedence may be overridden with
|
\%nonassoc} is optional. Additionally, precedence may be overridden
|
||||||
embedded {\tt \%prec} commands.
|
in the rules with {\tt \%prec} commands.
|
||||||
|
|
||||||
\section{Parser Definition Files}
|
\section{Parser Definition Files}
|
||||||
%*********************************
|
%*********************************
|
||||||
@@ -379,7 +382,7 @@ The general form for a parser definition is:
|
|||||||
|
|
||||||
\%\%
|
\%\%
|
||||||
|
|
||||||
Rule definition 1
|
Rule definition 1
|
||||||
\vdots
|
\vdots
|
||||||
Rule definition {\it n}
|
Rule definition {\it n}
|
||||||
|
|
||||||
@@ -397,8 +400,9 @@ The general form for a parser definition is:
|
|||||||
|
|
||||||
Rules take the form:
|
Rules take the form:
|
||||||
|
|
||||||
|
\vskip -\baselineskip
|
||||||
\beginexample
|
\beginexample
|
||||||
non-terminal : {\it statement} 1
|
non-terminal : {\it statement} 1
|
||||||
| {\it statement} 2
|
| {\it statement} 2
|
||||||
\vdots
|
\vdots
|
||||||
| {\it statement n}
|
| {\it statement n}
|
||||||
@@ -406,12 +410,12 @@ Rules take the form:
|
|||||||
\endexample
|
\endexample
|
||||||
|
|
||||||
Where {\it statements} can be either empty, or contain
|
Where {\it statements} can be either empty, or contain
|
||||||
a mixture of C code (enclosed in {\tt \{...\}}), and the
|
a mixture of C code (enclosed in {\tt \{...\}}), and the
|
||||||
symbols that make up the non-terminal. For example:
|
symbols that make up the non-terminal. For example:
|
||||||
|
|
||||||
\vskip -\baselineskip
|
\vskip -\baselineskip
|
||||||
\beginexample
|
\beginexample
|
||||||
expression : number '$+$' number \{ \$\$ $=$ \$1 $+$ \$3 \}
|
expression : number '$+$' number \{ \$\$ $=$ \$1 $+$ \$3 \}
|
||||||
| number '$-$' number \{ \$\$ $=$ \$1 $-$ \$3 \}
|
| number '$-$' number \{ \$\$ $=$ \$1 $-$ \$3 \}
|
||||||
| number '$/$' number \{ \$\$ $=$ \$1 $/$ \$3 \}
|
| number '$/$' number \{ \$\$ $=$ \$1 $/$ \$3 \}
|
||||||
| number '$*$' number \{ \$\$ $=$ \$1 $*$ \$3 \}
|
| number '$*$' number \{ \$\$ $=$ \$1 $*$ \$3 \}
|
||||||
@@ -428,7 +432,7 @@ For altering the precedence of a symbol use:
|
|||||||
For example:
|
For example:
|
||||||
\vskip -\baselineskip
|
\vskip -\baselineskip
|
||||||
\beginexample
|
\beginexample
|
||||||
foo : gnu bar gnu \%prec bar
|
foo : gnu bar gnu \%prec bar
|
||||||
;
|
;
|
||||||
\endexample
|
\endexample
|
||||||
|
|
||||||
@@ -438,16 +442,18 @@ For example:
|
|||||||
\key{Recognize an error \& continue parsing.}{error}
|
\key{Recognize an error \& continue parsing.}{error}
|
||||||
\key{Access data associated with a symbol.} {\$\$, \$0\dots\${\it n}}
|
\key{Access data associated with a symbol.} {\$\$, \$0\dots\${\it n}}
|
||||||
\key{Access a field of the data union.} {\$\$.{\it t},
|
\key{Access a field of the data union.} {\$\$.{\it t},
|
||||||
\$0.{\it t}\dots\${\it n}.{\it t}}
|
\$0.{\it t}\dots\${\it n}.{\it t}}
|
||||||
\key{Access data's line position.} {@{\it n}.{\it line\_spec}}
|
\key{Access symbol's location.} {@\$, @0\dots@{\it n}}
|
||||||
\key{Access data's column position.} {@{\it n}.{\it column\_spec}}
|
\key{Access data's line location.} {@{\it x}.{\it line\_spec}}
|
||||||
|
\key{Access data's column location.} {@{\it x}.{\it column\_spec}}
|
||||||
|
|
||||||
|
|
||||||
\vskip .10truein
|
\vskip .10truein
|
||||||
|
%
|
||||||
Where {\it t} is a type defined in the {\tt \%union}, {\it n} is a
|
Where {\it t} is a type defined in the {\tt \%union}, {\it n} is a
|
||||||
number, {\it line\_spec} one of {\tt first_line} and {\tt last_line},
|
number, {\it x} is a number or \$, {\it line\_spec} one of {\tt
|
||||||
and {\it column\_spec} is specified as either {\tt first_column} or {\tt
|
first_line} and {\tt last_line}, and {\it column\_spec} is specified
|
||||||
last_column}.
|
as either {\tt first_column} or {\tt last_column}.
|
||||||
|
|
||||||
\section {Variables and Types}
|
\section {Variables and Types}
|
||||||
%*****************************
|
%*****************************
|
||||||
|
|||||||
@@ -1,4 +0,0 @@
|
|||||||
@set UPDATED 20 September 2001
|
|
||||||
@set UPDATED-MONTH September 2001
|
|
||||||
@set EDITION 1.29f
|
|
||||||
@set VERSION 1.29f
|
|
||||||
+4
-4
@@ -1,4 +1,4 @@
|
|||||||
@set UPDATED 20 September 2001
|
@set UPDATED 30 November 2001
|
||||||
@set UPDATED-MONTH September 2001
|
@set UPDATED-MONTH November 2001
|
||||||
@set EDITION 1.29f
|
@set EDITION 1.30f
|
||||||
@set VERSION 1.29f
|
@set VERSION 1.30f
|
||||||
|
|||||||
+19
-4
@@ -1,7 +1,24 @@
|
|||||||
## Process this file with automake to produce Makefile.in -*-Makefile-*-
|
## 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 of the License, 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
|
||||||
|
|
||||||
AUTOMAKE_OPTIONS = ansi2knr
|
AUTOMAKE_OPTIONS = ansi2knr
|
||||||
|
|
||||||
|
CFLAGS = @CFLAGS@ $(WARNING_CFLAGS)
|
||||||
|
|
||||||
noinst_LIBRARIES = libbison.a
|
noinst_LIBRARIES = libbison.a
|
||||||
|
|
||||||
INCLUDES = -I.. -I$(srcdir) -I../intl
|
INCLUDES = -I.. -I$(srcdir) -I../intl
|
||||||
@@ -12,11 +29,9 @@ INCLUDES = -I.. -I$(srcdir) -I../intl
|
|||||||
EXTRA_DIST = malloc.c realloc.c
|
EXTRA_DIST = malloc.c realloc.c
|
||||||
|
|
||||||
libbison_a_SOURCES = \
|
libbison_a_SOURCES = \
|
||||||
error.c error.h \
|
|
||||||
getopt.h getopt.c getopt1.c \
|
getopt.h getopt.c getopt1.c \
|
||||||
obstack.h obstack.c \
|
|
||||||
quote.h quote.c quotearg.h quotearg.c \
|
quote.h quote.c quotearg.h quotearg.c \
|
||||||
xalloc.h xmalloc.c xstrdup.c
|
xalloc.h xmalloc.c xstrdup.c
|
||||||
|
|
||||||
libbison_a_LIBADD = @LIBOBJS@
|
libbison_a_LIBADD = @LIBOBJS@ @ALLOCA@
|
||||||
libbison_a_DEPENDENCIES = $(libbison_a_LIBADD)
|
libbison_a_DEPENDENCIES = $(libbison_a_LIBADD)
|
||||||
|
|||||||
+25
-25
@@ -1,4 +1,5 @@
|
|||||||
# Makefile.in generated automatically by automake 1.5a from Makefile.am.
|
# Makefile.in generated by automake 1.5a from Makefile.am.
|
||||||
|
# @configure_input@
|
||||||
|
|
||||||
# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
|
# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
|
||||||
# Free Software Foundation, Inc.
|
# Free Software Foundation, Inc.
|
||||||
@@ -83,8 +84,8 @@ INTLBISON = @INTLBISON@
|
|||||||
INTLLIBS = @INTLLIBS@
|
INTLLIBS = @INTLLIBS@
|
||||||
INTLOBJS = @INTLOBJS@
|
INTLOBJS = @INTLOBJS@
|
||||||
INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
|
INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
|
||||||
|
LIB = @LIB@
|
||||||
LIBICONV = @LIBICONV@
|
LIBICONV = @LIBICONV@
|
||||||
LIBOBJS = @LIBOBJS@
|
|
||||||
MKINSTALLDIRS = @MKINSTALLDIRS@
|
MKINSTALLDIRS = @MKINSTALLDIRS@
|
||||||
MSGFMT = @MSGFMT@
|
MSGFMT = @MSGFMT@
|
||||||
PACKAGE = @PACKAGE@
|
PACKAGE = @PACKAGE@
|
||||||
@@ -102,6 +103,8 @@ install_sh = @install_sh@
|
|||||||
|
|
||||||
AUTOMAKE_OPTIONS = ansi2knr
|
AUTOMAKE_OPTIONS = ansi2knr
|
||||||
|
|
||||||
|
CFLAGS = @CFLAGS@ $(WARNING_CFLAGS)
|
||||||
|
|
||||||
noinst_LIBRARIES = libbison.a
|
noinst_LIBRARIES = libbison.a
|
||||||
|
|
||||||
INCLUDES = -I.. -I$(srcdir) -I../intl
|
INCLUDES = -I.. -I$(srcdir) -I../intl
|
||||||
@@ -112,14 +115,12 @@ INCLUDES = -I.. -I$(srcdir) -I../intl
|
|||||||
EXTRA_DIST = malloc.c realloc.c
|
EXTRA_DIST = malloc.c realloc.c
|
||||||
|
|
||||||
libbison_a_SOURCES = \
|
libbison_a_SOURCES = \
|
||||||
error.c error.h \
|
|
||||||
getopt.h getopt.c getopt1.c \
|
getopt.h getopt.c getopt1.c \
|
||||||
obstack.h obstack.c \
|
|
||||||
quote.h quote.c quotearg.h quotearg.c \
|
quote.h quote.c quotearg.h quotearg.c \
|
||||||
xalloc.h xmalloc.c xstrdup.c
|
xalloc.h xmalloc.c xstrdup.c
|
||||||
|
|
||||||
|
|
||||||
libbison_a_LIBADD = @LIBOBJS@
|
libbison_a_LIBADD = @LIBOBJS@ @ALLOCA@
|
||||||
libbison_a_DEPENDENCIES = $(libbison_a_LIBADD)
|
libbison_a_DEPENDENCIES = $(libbison_a_LIBADD)
|
||||||
subdir = lib
|
subdir = lib
|
||||||
mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs
|
mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs
|
||||||
@@ -128,9 +129,9 @@ CONFIG_CLEAN_FILES =
|
|||||||
LIBRARIES = $(noinst_LIBRARIES)
|
LIBRARIES = $(noinst_LIBRARIES)
|
||||||
|
|
||||||
libbison_a_AR = $(AR) cru
|
libbison_a_AR = $(AR) cru
|
||||||
am_libbison_a_OBJECTS = error$U.$(OBJEXT) getopt$U.$(OBJEXT) \
|
am_libbison_a_OBJECTS = getopt$U.$(OBJEXT) getopt1$U.$(OBJEXT) \
|
||||||
getopt1$U.$(OBJEXT) obstack$U.$(OBJEXT) quote$U.$(OBJEXT) \
|
quote$U.$(OBJEXT) quotearg$U.$(OBJEXT) xmalloc$U.$(OBJEXT) \
|
||||||
quotearg$U.$(OBJEXT) xmalloc$U.$(OBJEXT) xstrdup$U.$(OBJEXT)
|
xstrdup$U.$(OBJEXT)
|
||||||
libbison_a_OBJECTS = $(am_libbison_a_OBJECTS)
|
libbison_a_OBJECTS = $(am_libbison_a_OBJECTS)
|
||||||
|
|
||||||
DEFS = @DEFS@
|
DEFS = @DEFS@
|
||||||
@@ -139,22 +140,22 @@ CPPFLAGS = @CPPFLAGS@
|
|||||||
LDFLAGS = @LDFLAGS@
|
LDFLAGS = @LDFLAGS@
|
||||||
LIBS = @LIBS@
|
LIBS = @LIBS@
|
||||||
depcomp = $(SHELL) $(top_srcdir)/config/depcomp
|
depcomp = $(SHELL) $(top_srcdir)/config/depcomp
|
||||||
@AMDEP_TRUE@DEP_FILES = $(DEPDIR)/error$U.Po $(DEPDIR)/getopt$U.Po \
|
@AMDEP_TRUE@DEP_FILES = $(DEPDIR)/alloca.Po $(DEPDIR)/error.Po \
|
||||||
@AMDEP_TRUE@ $(DEPDIR)/getopt1$U.Po $(DEPDIR)/malloc.Po \
|
@AMDEP_TRUE@ $(DEPDIR)/getopt$U.Po $(DEPDIR)/getopt1$U.Po \
|
||||||
@AMDEP_TRUE@ $(DEPDIR)/memchr.Po $(DEPDIR)/obstack$U.Po \
|
@AMDEP_TRUE@ $(DEPDIR)/malloc.Po $(DEPDIR)/memchr.Po \
|
||||||
@AMDEP_TRUE@ $(DEPDIR)/quote$U.Po $(DEPDIR)/quotearg$U.Po \
|
@AMDEP_TRUE@ $(DEPDIR)/obstack.Po $(DEPDIR)/quote$U.Po \
|
||||||
@AMDEP_TRUE@ $(DEPDIR)/realloc.Po $(DEPDIR)/stpcpy.Po \
|
@AMDEP_TRUE@ $(DEPDIR)/quotearg$U.Po $(DEPDIR)/realloc.Po \
|
||||||
@AMDEP_TRUE@ $(DEPDIR)/strndup.Po $(DEPDIR)/strnlen.Po \
|
@AMDEP_TRUE@ $(DEPDIR)/stpcpy.Po $(DEPDIR)/strndup.Po \
|
||||||
@AMDEP_TRUE@ $(DEPDIR)/strspn.Po $(DEPDIR)/xmalloc$U.Po \
|
@AMDEP_TRUE@ $(DEPDIR)/strnlen.Po $(DEPDIR)/strspn.Po \
|
||||||
@AMDEP_TRUE@ $(DEPDIR)/xstrdup$U.Po
|
@AMDEP_TRUE@ $(DEPDIR)/xmalloc$U.Po $(DEPDIR)/xstrdup$U.Po
|
||||||
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
|
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
|
||||||
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
||||||
CCLD = $(CC)
|
CCLD = $(CC)
|
||||||
LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
|
LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
|
||||||
CFLAGS = @CFLAGS@
|
|
||||||
DIST_SOURCES = $(libbison_a_SOURCES)
|
DIST_SOURCES = $(libbison_a_SOURCES)
|
||||||
DIST_COMMON = Makefile.am Makefile.in ansi2knr.1 ansi2knr.c malloc.c \
|
DIST_COMMON = Makefile.am Makefile.in alloca.c ansi2knr.1 ansi2knr.c \
|
||||||
memchr.c realloc.c stpcpy.c strndup.c strnlen.c strspn.c
|
error.c error.h malloc.c memchr.c obstack.c obstack.h realloc.c \
|
||||||
|
stpcpy.c strndup.c strnlen.c strspn.c
|
||||||
SOURCES = $(libbison_a_SOURCES)
|
SOURCES = $(libbison_a_SOURCES)
|
||||||
|
|
||||||
all: all-am
|
all: all-am
|
||||||
@@ -165,9 +166,7 @@ $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
|
|||||||
cd $(top_srcdir) && \
|
cd $(top_srcdir) && \
|
||||||
$(AUTOMAKE) --gnu lib/Makefile
|
$(AUTOMAKE) --gnu lib/Makefile
|
||||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||||
cd $(top_builddir) && \
|
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
|
||||||
CONFIG_HEADERS= CONFIG_LINKS= \
|
|
||||||
CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status
|
|
||||||
|
|
||||||
AR = ar
|
AR = ar
|
||||||
|
|
||||||
@@ -193,14 +192,15 @@ clean-krextra:
|
|||||||
-rm -f ansi2knr
|
-rm -f ansi2knr
|
||||||
|
|
||||||
mostlyclean-kr:
|
mostlyclean-kr:
|
||||||
-rm -f *_.c
|
-test "$U" = "" || rm -f *_.c
|
||||||
|
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/error$U.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/alloca.Po@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/error.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/getopt$U.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/getopt$U.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/getopt1$U.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/getopt1$U.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/malloc.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/malloc.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/memchr.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/memchr.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/obstack$U.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/obstack.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/quote$U.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/quote$U.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/quotearg$U.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/quotearg$U.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/realloc.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/realloc.Po@am__quote@
|
||||||
|
|||||||
+66
-66
@@ -22,18 +22,18 @@
|
|||||||
your main control loop, etc. to force garbage collection. */
|
your main control loop, etc. to force garbage collection. */
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
#ifdef HAVE_CONFIG_H
|
||||||
#include <config.h>
|
# include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_STRING_H
|
#if HAVE_STRING_H
|
||||||
#include <string.h>
|
# include <string.h>
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_STDLIB_H
|
#if HAVE_STDLIB_H
|
||||||
#include <stdlib.h>
|
# include <stdlib.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef emacs
|
#ifdef emacs
|
||||||
#include "blockinput.h"
|
# include "blockinput.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* If compiling with GCC 2, this file's not needed. */
|
/* If compiling with GCC 2, this file's not needed. */
|
||||||
@@ -41,41 +41,41 @@
|
|||||||
|
|
||||||
/* If someone has defined alloca as a macro,
|
/* If someone has defined alloca as a macro,
|
||||||
there must be some other way alloca is supposed to work. */
|
there must be some other way alloca is supposed to work. */
|
||||||
#ifndef alloca
|
# ifndef alloca
|
||||||
|
|
||||||
#ifdef emacs
|
# ifdef emacs
|
||||||
#ifdef static
|
# ifdef static
|
||||||
/* actually, only want this if static is defined as ""
|
/* actually, only want this if static is defined as ""
|
||||||
-- this is for usg, in which emacs must undefine static
|
-- this is for usg, in which emacs must undefine static
|
||||||
in order to make unexec workable
|
in order to make unexec workable
|
||||||
*/
|
*/
|
||||||
#ifndef STACK_DIRECTION
|
# ifndef STACK_DIRECTION
|
||||||
you
|
you
|
||||||
lose
|
lose
|
||||||
-- must know STACK_DIRECTION at compile-time
|
-- must know STACK_DIRECTION at compile-time
|
||||||
#endif /* STACK_DIRECTION undefined */
|
# endif /* STACK_DIRECTION undefined */
|
||||||
#endif /* static */
|
# endif /* static */
|
||||||
#endif /* emacs */
|
# endif /* emacs */
|
||||||
|
|
||||||
/* If your stack is a linked list of frames, you have to
|
/* If your stack is a linked list of frames, you have to
|
||||||
provide an "address metric" ADDRESS_FUNCTION macro. */
|
provide an "address metric" ADDRESS_FUNCTION macro. */
|
||||||
|
|
||||||
#if defined (CRAY) && defined (CRAY_STACKSEG_END)
|
# if defined (CRAY) && defined (CRAY_STACKSEG_END)
|
||||||
long i00afunc ();
|
long i00afunc ();
|
||||||
#define ADDRESS_FUNCTION(arg) (char *) i00afunc (&(arg))
|
# define ADDRESS_FUNCTION(arg) (char *) i00afunc (&(arg))
|
||||||
#else
|
# else
|
||||||
#define ADDRESS_FUNCTION(arg) &(arg)
|
# define ADDRESS_FUNCTION(arg) &(arg)
|
||||||
#endif
|
# endif
|
||||||
|
|
||||||
#if __STDC__
|
# if __STDC__
|
||||||
typedef void *pointer;
|
typedef void *pointer;
|
||||||
#else
|
# else
|
||||||
typedef char *pointer;
|
typedef char *pointer;
|
||||||
#endif
|
# endif
|
||||||
|
|
||||||
#ifndef NULL
|
# ifndef NULL
|
||||||
#define NULL 0
|
# define NULL 0
|
||||||
#endif
|
# endif
|
||||||
|
|
||||||
/* Different portions of Emacs need to call different versions of
|
/* Different portions of Emacs need to call different versions of
|
||||||
malloc. The Emacs executable needs alloca to call xmalloc, because
|
malloc. The Emacs executable needs alloca to call xmalloc, because
|
||||||
@@ -83,13 +83,14 @@ typedef char *pointer;
|
|||||||
hand, the utilities in lib-src need alloca to call malloc; some of
|
hand, the utilities in lib-src need alloca to call malloc; some of
|
||||||
them are very simple, and don't have an xmalloc routine.
|
them are very simple, and don't have an xmalloc routine.
|
||||||
|
|
||||||
Non-Emacs programs expect this to call use xmalloc.
|
Non-Emacs programs expect this to call xmalloc.
|
||||||
|
|
||||||
Callers below should use malloc. */
|
Callers below should use malloc. */
|
||||||
|
|
||||||
#ifndef emacs
|
# ifndef emacs
|
||||||
#define malloc xmalloc
|
# undef malloc
|
||||||
#endif
|
# define malloc xmalloc
|
||||||
|
# endif
|
||||||
extern pointer malloc ();
|
extern pointer malloc ();
|
||||||
|
|
||||||
/* Define STACK_DIRECTION if you know the direction of stack
|
/* Define STACK_DIRECTION if you know the direction of stack
|
||||||
@@ -100,18 +101,18 @@ extern pointer malloc ();
|
|||||||
STACK_DIRECTION < 0 => grows toward lower addresses
|
STACK_DIRECTION < 0 => grows toward lower addresses
|
||||||
STACK_DIRECTION = 0 => direction of growth unknown */
|
STACK_DIRECTION = 0 => direction of growth unknown */
|
||||||
|
|
||||||
#ifndef STACK_DIRECTION
|
# ifndef STACK_DIRECTION
|
||||||
#define STACK_DIRECTION 0 /* Direction unknown. */
|
# define STACK_DIRECTION 0 /* Direction unknown. */
|
||||||
#endif
|
# endif
|
||||||
|
|
||||||
#if STACK_DIRECTION != 0
|
# if STACK_DIRECTION != 0
|
||||||
|
|
||||||
#define STACK_DIR STACK_DIRECTION /* Known at compile-time. */
|
# define STACK_DIR STACK_DIRECTION /* Known at compile-time. */
|
||||||
|
|
||||||
#else /* STACK_DIRECTION == 0; need run-time code. */
|
# else /* STACK_DIRECTION == 0; need run-time code. */
|
||||||
|
|
||||||
static int stack_dir; /* 1 or -1 once known. */
|
static int stack_dir; /* 1 or -1 once known. */
|
||||||
#define STACK_DIR stack_dir
|
# define STACK_DIR stack_dir
|
||||||
|
|
||||||
static void
|
static void
|
||||||
find_stack_direction ()
|
find_stack_direction ()
|
||||||
@@ -135,7 +136,7 @@ find_stack_direction ()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* STACK_DIRECTION == 0 */
|
# endif /* STACK_DIRECTION == 0 */
|
||||||
|
|
||||||
/* An "alloca header" is used to:
|
/* An "alloca header" is used to:
|
||||||
(a) chain together all alloca'ed blocks;
|
(a) chain together all alloca'ed blocks;
|
||||||
@@ -144,9 +145,9 @@ find_stack_direction ()
|
|||||||
It is very important that sizeof(header) agree with malloc
|
It is very important that sizeof(header) agree with malloc
|
||||||
alignment chunk size. The following default should work okay. */
|
alignment chunk size. The following default should work okay. */
|
||||||
|
|
||||||
#ifndef ALIGN_SIZE
|
# ifndef ALIGN_SIZE
|
||||||
#define ALIGN_SIZE sizeof(double)
|
# define ALIGN_SIZE sizeof(double)
|
||||||
#endif
|
# endif
|
||||||
|
|
||||||
typedef union hdr
|
typedef union hdr
|
||||||
{
|
{
|
||||||
@@ -168,16 +169,15 @@ static header *last_alloca_header = NULL; /* -> last alloca header. */
|
|||||||
implementations of C, for example under Gould's UTX/32. */
|
implementations of C, for example under Gould's UTX/32. */
|
||||||
|
|
||||||
pointer
|
pointer
|
||||||
alloca (size)
|
alloca (size_t size)
|
||||||
unsigned size;
|
|
||||||
{
|
{
|
||||||
auto char probe; /* Probes stack depth: */
|
auto char probe; /* Probes stack depth: */
|
||||||
register char *depth = ADDRESS_FUNCTION (probe);
|
register char *depth = ADDRESS_FUNCTION (probe);
|
||||||
|
|
||||||
#if STACK_DIRECTION == 0
|
# if STACK_DIRECTION == 0
|
||||||
if (STACK_DIR == 0) /* Unknown growth direction. */
|
if (STACK_DIR == 0) /* Unknown growth direction. */
|
||||||
find_stack_direction ();
|
find_stack_direction ();
|
||||||
#endif
|
# endif
|
||||||
|
|
||||||
/* Reclaim garbage, defined as all alloca'd storage that
|
/* Reclaim garbage, defined as all alloca'd storage that
|
||||||
was allocated from deeper in the stack than currently. */
|
was allocated from deeper in the stack than currently. */
|
||||||
@@ -185,9 +185,9 @@ alloca (size)
|
|||||||
{
|
{
|
||||||
register header *hp; /* Traverses linked list. */
|
register header *hp; /* Traverses linked list. */
|
||||||
|
|
||||||
#ifdef emacs
|
# ifdef emacs
|
||||||
BLOCK_INPUT;
|
BLOCK_INPUT;
|
||||||
#endif
|
# endif
|
||||||
|
|
||||||
for (hp = last_alloca_header; hp != NULL;)
|
for (hp = last_alloca_header; hp != NULL;)
|
||||||
if ((STACK_DIR > 0 && hp->h.deep > depth)
|
if ((STACK_DIR > 0 && hp->h.deep > depth)
|
||||||
@@ -204,9 +204,9 @@ alloca (size)
|
|||||||
|
|
||||||
last_alloca_header = hp; /* -> last valid storage. */
|
last_alloca_header = hp; /* -> last valid storage. */
|
||||||
|
|
||||||
#ifdef emacs
|
# ifdef emacs
|
||||||
UNBLOCK_INPUT;
|
UNBLOCK_INPUT;
|
||||||
#endif
|
# endif
|
||||||
}
|
}
|
||||||
|
|
||||||
if (size == 0)
|
if (size == 0)
|
||||||
@@ -232,15 +232,15 @@ alloca (size)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined (CRAY) && defined (CRAY_STACKSEG_END)
|
# if defined (CRAY) && defined (CRAY_STACKSEG_END)
|
||||||
|
|
||||||
#ifdef DEBUG_I00AFUNC
|
# ifdef DEBUG_I00AFUNC
|
||||||
#include <stdio.h>
|
# include <stdio.h>
|
||||||
#endif
|
# endif
|
||||||
|
|
||||||
#ifndef CRAY_STACK
|
# ifndef CRAY_STACK
|
||||||
#define CRAY_STACK
|
# define CRAY_STACK
|
||||||
#ifndef CRAY2
|
# ifndef CRAY2
|
||||||
/* Stack structures for CRAY-1, CRAY X-MP, and CRAY Y-MP */
|
/* Stack structures for CRAY-1, CRAY X-MP, and CRAY Y-MP */
|
||||||
struct stack_control_header
|
struct stack_control_header
|
||||||
{
|
{
|
||||||
@@ -292,7 +292,7 @@ struct stack_segment_linkage
|
|||||||
long sss7;
|
long sss7;
|
||||||
};
|
};
|
||||||
|
|
||||||
#else /* CRAY2 */
|
# else /* CRAY2 */
|
||||||
/* The following structure defines the vector of words
|
/* The following structure defines the vector of words
|
||||||
returned by the STKSTAT library routine. */
|
returned by the STKSTAT library routine. */
|
||||||
struct stk_stat
|
struct stk_stat
|
||||||
@@ -345,10 +345,10 @@ struct stk_trailer
|
|||||||
long unknown14;
|
long unknown14;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* CRAY2 */
|
# endif /* CRAY2 */
|
||||||
#endif /* not CRAY_STACK */
|
# endif /* not CRAY_STACK */
|
||||||
|
|
||||||
#ifdef CRAY2
|
# ifdef CRAY2
|
||||||
/* Determine a "stack measure" for an arbitrary ADDRESS.
|
/* Determine a "stack measure" for an arbitrary ADDRESS.
|
||||||
I doubt that "lint" will like this much. */
|
I doubt that "lint" will like this much. */
|
||||||
|
|
||||||
@@ -419,7 +419,7 @@ i00afunc (long *address)
|
|||||||
return (result);
|
return (result);
|
||||||
}
|
}
|
||||||
|
|
||||||
#else /* not CRAY2 */
|
# else /* not CRAY2 */
|
||||||
/* Stack address function for a CRAY-1, CRAY X-MP, or CRAY Y-MP.
|
/* Stack address function for a CRAY-1, CRAY X-MP, or CRAY Y-MP.
|
||||||
Determine the number of the cell within the stack,
|
Determine the number of the cell within the stack,
|
||||||
given the address of the cell. The purpose of this
|
given the address of the cell. The purpose of this
|
||||||
@@ -464,9 +464,9 @@ i00afunc (long address)
|
|||||||
|
|
||||||
while (!(this_segment <= address && address <= stkl))
|
while (!(this_segment <= address && address <= stkl))
|
||||||
{
|
{
|
||||||
#ifdef DEBUG_I00AFUNC
|
# ifdef DEBUG_I00AFUNC
|
||||||
fprintf (stderr, "%011o %011o %011o\n", this_segment, address, stkl);
|
fprintf (stderr, "%011o %011o %011o\n", this_segment, address, stkl);
|
||||||
#endif
|
# endif
|
||||||
if (pseg == 0)
|
if (pseg == 0)
|
||||||
break;
|
break;
|
||||||
stkl = stkl - pseg;
|
stkl = stkl - pseg;
|
||||||
@@ -485,9 +485,9 @@ i00afunc (long address)
|
|||||||
|
|
||||||
while (pseg != 0)
|
while (pseg != 0)
|
||||||
{
|
{
|
||||||
#ifdef DEBUG_I00AFUNC
|
# ifdef DEBUG_I00AFUNC
|
||||||
fprintf (stderr, "%011o %011o\n", pseg, size);
|
fprintf (stderr, "%011o %011o\n", pseg, size);
|
||||||
#endif
|
# endif
|
||||||
stkl = stkl - pseg;
|
stkl = stkl - pseg;
|
||||||
ssptr = (struct stack_segment_linkage *) stkl;
|
ssptr = (struct stack_segment_linkage *) stkl;
|
||||||
size = ssptr->sssize;
|
size = ssptr->sssize;
|
||||||
@@ -497,8 +497,8 @@ i00afunc (long address)
|
|||||||
return (result);
|
return (result);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* not CRAY2 */
|
# endif /* not CRAY2 */
|
||||||
#endif /* CRAY */
|
# endif /* CRAY */
|
||||||
|
|
||||||
#endif /* no alloca */
|
# endif /* no alloca */
|
||||||
#endif /* not GCC version 2 */
|
#endif /* not GCC version 2 */
|
||||||
|
|||||||
+198
-74
@@ -1,23 +1,22 @@
|
|||||||
/* Error handler for noninteractive utilities
|
/* Error handler for noninteractive utilities
|
||||||
Copyright (C) 1990-1998, 2000 Free Software Foundation, Inc.
|
Copyright (C) 1990-1998, 2000, 2001 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of the GNU C Library. Its master source is NOT part of
|
This file is part of the GNU C Library. Its master source is NOT part of
|
||||||
the C library, however. The master source lives in /gd/gnu/lib.
|
the C library, however. The master source lives in /gd/gnu/lib.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
modify it under the terms of the GNU Library General Public License as
|
modify it under the terms of the GNU Lesser General Public
|
||||||
published by the Free Software Foundation; either version 2 of the
|
License as published by the Free Software Foundation; either
|
||||||
License, or (at your option) any later version.
|
version 2.1 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
The GNU C Library is distributed in the hope that it will be useful,
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
Library General Public License for more details.
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU Library General Public
|
You should have received a copy of the GNU Lesser General Public
|
||||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
License along with the GNU C Library; if not, write to the Free
|
||||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
Boston, MA 02111-1307, USA. */
|
02111-1307 USA. */
|
||||||
|
|
||||||
/* Written by David MacKenzie <[email protected]>. */
|
/* Written by David MacKenzie <[email protected]>. */
|
||||||
|
|
||||||
@@ -29,6 +28,10 @@
|
|||||||
#if HAVE_LIBINTL_H
|
#if HAVE_LIBINTL_H
|
||||||
# include <libintl.h>
|
# include <libintl.h>
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef _LIBC
|
||||||
|
# include <wchar.h>
|
||||||
|
# define mbsrtowcs __mbsrtowcs
|
||||||
|
#endif
|
||||||
|
|
||||||
#if HAVE_VPRINTF || HAVE_DOPRNT || _LIBC
|
#if HAVE_VPRINTF || HAVE_DOPRNT || _LIBC
|
||||||
# if __STDC__
|
# if __STDC__
|
||||||
@@ -52,13 +55,6 @@ void exit ();
|
|||||||
|
|
||||||
#include "error.h"
|
#include "error.h"
|
||||||
|
|
||||||
#ifndef HAVE_DECL_STRERROR_R
|
|
||||||
"this configure-time declaration test was not run"
|
|
||||||
#endif
|
|
||||||
#if !HAVE_DECL_STRERROR_R
|
|
||||||
char *strerror_r ();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef _
|
#ifndef _
|
||||||
# define _(String) String
|
# define _(String) String
|
||||||
#endif
|
#endif
|
||||||
@@ -83,6 +79,12 @@ unsigned int error_message_count;
|
|||||||
|
|
||||||
/* In GNU libc we want do not want to use the common name `error' directly.
|
/* In GNU libc we want do not want to use the common name `error' directly.
|
||||||
Instead make it a weak alias. */
|
Instead make it a weak alias. */
|
||||||
|
extern void __error (int status, int errnum, const char *message, ...)
|
||||||
|
__attribute__ ((__format__ (__printf__, 3, 4)));
|
||||||
|
extern void __error_at_line (int status, int errnum, const char *file_name,
|
||||||
|
unsigned int line_number, const char *message,
|
||||||
|
...)
|
||||||
|
__attribute__ ((__format__ (__printf__, 5, 6)));;
|
||||||
# define error __error
|
# define error __error
|
||||||
# define error_at_line __error_at_line
|
# define error_at_line __error_at_line
|
||||||
|
|
||||||
@@ -93,21 +95,30 @@ unsigned int error_message_count;
|
|||||||
|
|
||||||
#else /* not _LIBC */
|
#else /* not _LIBC */
|
||||||
|
|
||||||
|
# if !HAVE_DECL_STRERROR_R && STRERROR_R_CHAR_P
|
||||||
|
# ifndef HAVE_DECL_STRERROR_R
|
||||||
|
"this configure-time declaration test was not run"
|
||||||
|
# endif
|
||||||
|
char *strerror_r ();
|
||||||
|
# endif
|
||||||
|
|
||||||
/* The calling program should define program_name and set it to the
|
/* The calling program should define program_name and set it to the
|
||||||
name of the executing program. */
|
name of the executing program. */
|
||||||
extern char *program_name;
|
extern char *program_name;
|
||||||
|
|
||||||
# ifdef HAVE_STRERROR_R
|
# if HAVE_STRERROR_R || defined strerror_r
|
||||||
# define __strerror_r strerror_r
|
# define __strerror_r strerror_r
|
||||||
# else
|
# else
|
||||||
# if HAVE_STRERROR
|
# if HAVE_STRERROR
|
||||||
# ifndef strerror /* On some systems, strerror is a macro */
|
# ifndef HAVE_DECL_STRERROR
|
||||||
|
"this configure-time declaration test was not run"
|
||||||
|
# endif
|
||||||
|
# if !HAVE_DECL_STRERROR
|
||||||
char *strerror ();
|
char *strerror ();
|
||||||
# endif
|
# endif
|
||||||
# else
|
# else
|
||||||
static char *
|
static char *
|
||||||
private_strerror (errnum)
|
private_strerror (int errnum)
|
||||||
int errnum;
|
|
||||||
{
|
{
|
||||||
extern char *sys_errlist[];
|
extern char *sys_errlist[];
|
||||||
extern int sys_nerr;
|
extern int sys_nerr;
|
||||||
@@ -118,15 +129,118 @@ private_strerror (errnum)
|
|||||||
}
|
}
|
||||||
# define strerror private_strerror
|
# define strerror private_strerror
|
||||||
# endif /* HAVE_STRERROR */
|
# endif /* HAVE_STRERROR */
|
||||||
# endif /* HAVE_STRERROR_R */
|
# endif /* HAVE_STRERROR_R || defined strerror_r */
|
||||||
#endif /* not _LIBC */
|
#endif /* not _LIBC */
|
||||||
|
|
||||||
|
static void
|
||||||
|
print_errno_message (int errnum)
|
||||||
|
{
|
||||||
|
char const *s;
|
||||||
|
|
||||||
|
#if defined HAVE_STRERROR_R || _LIBC
|
||||||
|
char errbuf[1024];
|
||||||
|
# if STRERROR_R_CHAR_P || _LIBC
|
||||||
|
s = __strerror_r (errnum, errbuf, sizeof errbuf);
|
||||||
|
# else
|
||||||
|
if (__strerror_r (errnum, errbuf, sizeof errbuf) == 0)
|
||||||
|
s = errbuf;
|
||||||
|
else
|
||||||
|
s = 0;
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
s = strerror (errnum);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !_LIBC
|
||||||
|
if (! s)
|
||||||
|
s = _("Unknown system error");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if _LIBC && USE_IN_LIBIO
|
||||||
|
if (_IO_fwide (stderr, 0) > 0)
|
||||||
|
{
|
||||||
|
__fwprintf (stderr, L": %s", s);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
fprintf (stderr, ": %s", s);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef VA_START
|
||||||
|
static void
|
||||||
|
error_tail (int status, int errnum, const char *message, va_list args)
|
||||||
|
{
|
||||||
|
# if HAVE_VPRINTF || _LIBC
|
||||||
|
# if _LIBC && USE_IN_LIBIO
|
||||||
|
if (_IO_fwide (stderr, 0) > 0)
|
||||||
|
{
|
||||||
|
# define ALLOCA_LIMIT 2000
|
||||||
|
size_t len = strlen (message) + 1;
|
||||||
|
wchar_t *wmessage = NULL;
|
||||||
|
mbstate_t st;
|
||||||
|
size_t res;
|
||||||
|
const char *tmp;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (len < ALLOCA_LIMIT)
|
||||||
|
wmessage = (wchar_t *) alloca (len * sizeof (wchar_t));
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (wmessage != NULL && len / 2 < ALLOCA_LIMIT)
|
||||||
|
wmessage = NULL;
|
||||||
|
|
||||||
|
wmessage = (wchar_t *) realloc (wmessage,
|
||||||
|
len * sizeof (wchar_t));
|
||||||
|
|
||||||
|
if (wmessage == NULL)
|
||||||
|
{
|
||||||
|
fputws_unlocked (L"out of memory\n", stderr);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
memset (&st, '\0', sizeof (st));
|
||||||
|
tmp =message;
|
||||||
|
}
|
||||||
|
while ((res = mbsrtowcs (wmessage, &tmp, len, &st)) == len);
|
||||||
|
|
||||||
|
if (res == (size_t) -1)
|
||||||
|
/* The string cannot be converted. */
|
||||||
|
wmessage = (wchar_t *) L"???";
|
||||||
|
|
||||||
|
__vfwprintf (stderr, wmessage, args);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
# endif
|
||||||
|
vfprintf (stderr, message, args);
|
||||||
|
# else
|
||||||
|
_doprnt (message, args, stderr);
|
||||||
|
# endif
|
||||||
|
va_end (args);
|
||||||
|
|
||||||
|
++error_message_count;
|
||||||
|
if (errnum)
|
||||||
|
print_errno_message (errnum);
|
||||||
|
# if _LIBC && USE_IN_LIBIO
|
||||||
|
if (_IO_fwide (stderr, 0) > 0)
|
||||||
|
putwc (L'\n', stderr);
|
||||||
|
else
|
||||||
|
# endif
|
||||||
|
putc ('\n', stderr);
|
||||||
|
fflush (stderr);
|
||||||
|
if (status)
|
||||||
|
exit (status);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* Print the program name and error message MESSAGE, which is a printf-style
|
/* Print the program name and error message MESSAGE, which is a printf-style
|
||||||
format string with optional args.
|
format string with optional args.
|
||||||
If ERRNUM is nonzero, print its corresponding system error message.
|
If ERRNUM is nonzero, print its corresponding system error message.
|
||||||
Exit with status STATUS if it is nonzero. */
|
Exit with status STATUS if it is nonzero. */
|
||||||
/* VARARGS */
|
/* VARARGS */
|
||||||
|
|
||||||
void
|
void
|
||||||
#if defined VA_START && __STDC__
|
#if defined VA_START && __STDC__
|
||||||
error (int status, int errnum, const char *message, ...)
|
error (int status, int errnum, const char *message, ...)
|
||||||
@@ -142,47 +256,48 @@ error (status, errnum, message, va_alist)
|
|||||||
va_list args;
|
va_list args;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
fflush (stdout);
|
||||||
|
#ifdef _LIBC
|
||||||
|
# ifdef USE_IN_LIBIO
|
||||||
|
_IO_flockfile (stderr);
|
||||||
|
# else
|
||||||
|
__flockfile (stderr);
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
if (error_print_progname)
|
if (error_print_progname)
|
||||||
(*error_print_progname) ();
|
(*error_print_progname) ();
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
fflush (stdout);
|
#if _LIBC && USE_IN_LIBIO
|
||||||
fprintf (stderr, "%s: ", program_name);
|
if (_IO_fwide (stderr, 0) > 0)
|
||||||
|
__fwprintf (stderr, L"%s: ", program_name);
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
fprintf (stderr, "%s: ", program_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef VA_START
|
#ifdef VA_START
|
||||||
VA_START (args, message);
|
VA_START (args, message);
|
||||||
# if HAVE_VPRINTF || _LIBC
|
error_tail (status, errnum, message, args);
|
||||||
vfprintf (stderr, message, args);
|
|
||||||
# else
|
|
||||||
_doprnt (message, args, stderr);
|
|
||||||
# endif
|
|
||||||
va_end (args);
|
|
||||||
#else
|
#else
|
||||||
fprintf (stderr, message, a1, a2, a3, a4, a5, a6, a7, a8);
|
fprintf (stderr, message, a1, a2, a3, a4, a5, a6, a7, a8);
|
||||||
#endif
|
|
||||||
|
|
||||||
++error_message_count;
|
++error_message_count;
|
||||||
if (errnum)
|
if (errnum)
|
||||||
{
|
print_errno_message (errnum);
|
||||||
#if defined HAVE_STRERROR_R || _LIBC
|
|
||||||
char errbuf[1024];
|
|
||||||
# if HAVE_WORKING_STRERROR_R || _LIBC
|
|
||||||
fprintf (stderr, ": %s", __strerror_r (errnum, errbuf, sizeof errbuf));
|
|
||||||
# else
|
|
||||||
/* Don't use __strerror_r's return value because on some systems
|
|
||||||
(at least DEC UNIX 4.0[A-D]) strerror_r returns `int'. */
|
|
||||||
__strerror_r (errnum, errbuf, sizeof errbuf);
|
|
||||||
fprintf (stderr, ": %s", errbuf);
|
|
||||||
# endif
|
|
||||||
#else
|
|
||||||
fprintf (stderr, ": %s", strerror (errnum));
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
putc ('\n', stderr);
|
putc ('\n', stderr);
|
||||||
fflush (stderr);
|
fflush (stderr);
|
||||||
if (status)
|
if (status)
|
||||||
exit (status);
|
exit (status);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef _LIBC
|
||||||
|
# ifdef USE_IN_LIBIO
|
||||||
|
_IO_funlockfile (stderr);
|
||||||
|
# else
|
||||||
|
__funlockfile (stderr);
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Sometimes we want to have at most one error per line. This
|
/* Sometimes we want to have at most one error per line. This
|
||||||
@@ -212,8 +327,9 @@ error_at_line (status, errnum, file_name, line_number, message, va_alist)
|
|||||||
static const char *old_file_name;
|
static const char *old_file_name;
|
||||||
static unsigned int old_line_number;
|
static unsigned int old_line_number;
|
||||||
|
|
||||||
if (old_line_number == line_number &&
|
if (old_line_number == line_number
|
||||||
(file_name == old_file_name || !strcmp (old_file_name, file_name)))
|
&& (file_name == old_file_name
|
||||||
|
|| strcmp (old_file_name, file_name) == 0))
|
||||||
/* Simply return and print nothing. */
|
/* Simply return and print nothing. */
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -221,50 +337,58 @@ error_at_line (status, errnum, file_name, line_number, message, va_alist)
|
|||||||
old_line_number = line_number;
|
old_line_number = line_number;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fflush (stdout);
|
||||||
|
#ifdef _LIBC
|
||||||
|
# ifdef USE_IN_LIBIO
|
||||||
|
_IO_flockfile (stderr);
|
||||||
|
# else
|
||||||
|
__flockfile (stderr);
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
if (error_print_progname)
|
if (error_print_progname)
|
||||||
(*error_print_progname) ();
|
(*error_print_progname) ();
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
fflush (stdout);
|
#if _LIBC && USE_IN_LIBIO
|
||||||
fprintf (stderr, "%s:", program_name);
|
if (_IO_fwide (stderr, 0) > 0)
|
||||||
|
__fwprintf (stderr, L"%s: ", program_name);
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
fprintf (stderr, "%s:", program_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (file_name != NULL)
|
if (file_name != NULL)
|
||||||
fprintf (stderr, "%s:%d: ", file_name, line_number);
|
{
|
||||||
|
#if _LIBC && USE_IN_LIBIO
|
||||||
|
if (_IO_fwide (stderr, 0) > 0)
|
||||||
|
__fwprintf (stderr, L"%s:%d: ", file_name, line_number);
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
fprintf (stderr, "%s:%d: ", file_name, line_number);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef VA_START
|
#ifdef VA_START
|
||||||
VA_START (args, message);
|
VA_START (args, message);
|
||||||
# if HAVE_VPRINTF || _LIBC
|
error_tail (status, errnum, message, args);
|
||||||
vfprintf (stderr, message, args);
|
|
||||||
# else
|
|
||||||
_doprnt (message, args, stderr);
|
|
||||||
# endif
|
|
||||||
va_end (args);
|
|
||||||
#else
|
#else
|
||||||
fprintf (stderr, message, a1, a2, a3, a4, a5, a6, a7, a8);
|
fprintf (stderr, message, a1, a2, a3, a4, a5, a6, a7, a8);
|
||||||
#endif
|
|
||||||
|
|
||||||
++error_message_count;
|
++error_message_count;
|
||||||
if (errnum)
|
if (errnum)
|
||||||
{
|
print_errno_message (errnum);
|
||||||
#if defined HAVE_STRERROR_R || _LIBC
|
|
||||||
char errbuf[1024];
|
|
||||||
# if HAVE_WORKING_STRERROR_R || _LIBC
|
|
||||||
fprintf (stderr, ": %s", __strerror_r (errnum, errbuf, sizeof errbuf));
|
|
||||||
# else
|
|
||||||
/* Don't use __strerror_r's return value because on some systems
|
|
||||||
(at least DEC UNIX 4.0[A-D]) strerror_r returns `int'. */
|
|
||||||
__strerror_r (errnum, errbuf, sizeof errbuf);
|
|
||||||
fprintf (stderr, ": %s", errbuf);
|
|
||||||
# endif
|
|
||||||
#else
|
|
||||||
fprintf (stderr, ": %s", strerror (errnum));
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
putc ('\n', stderr);
|
putc ('\n', stderr);
|
||||||
fflush (stderr);
|
fflush (stderr);
|
||||||
if (status)
|
if (status)
|
||||||
exit (status);
|
exit (status);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef _LIBC
|
||||||
|
# ifdef USE_IN_LIBIO
|
||||||
|
_IO_funlockfile (stderr);
|
||||||
|
# else
|
||||||
|
__funlockfile (stderr);
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef _LIBC
|
#ifdef _LIBC
|
||||||
|
|||||||
+1
-1
@@ -25,7 +25,7 @@
|
|||||||
|
|
||||||
#ifndef __attribute__
|
#ifndef __attribute__
|
||||||
/* This feature is available in gcc versions 2.5 and later. */
|
/* This feature is available in gcc versions 2.5 and later. */
|
||||||
# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__
|
# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5)
|
||||||
# define __attribute__(Spec) /* empty */
|
# define __attribute__(Spec) /* empty */
|
||||||
# endif
|
# endif
|
||||||
/* The __-protected variants of `format' and `printf' attributes
|
/* The __-protected variants of `format' and `printf' attributes
|
||||||
|
|||||||
+59
-40
@@ -1,23 +1,25 @@
|
|||||||
/* Getopt for GNU.
|
/* Getopt for GNU.
|
||||||
NOTE: The canonical source of this file is maintained with the GNU
|
NOTE: getopt is now part of the C library, so if you don't know what
|
||||||
C Library. Bugs can be reported to bug-glibc@gnu.org.
|
"Keep this file name-space clean" means, talk to drepper@gnu.org
|
||||||
|
before changing it!
|
||||||
Copyright (C) 1987, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99
|
Copyright (C) 1987,88,89,90,91,92,93,94,95,96,98,99,2000,2001
|
||||||
Free Software Foundation, Inc.
|
Free Software Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify it
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
under the terms of the GNU General Public License as published by the
|
modify it under the terms of the GNU Lesser General Public
|
||||||
Free Software Foundation; either version 2, or (at your option) any
|
License as published by the Free Software Foundation; either
|
||||||
later version.
|
version 2.1 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
GNU General Public License for more details.
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU Lesser General Public
|
||||||
along with this program; if not, write to the Free Software Foundation,
|
License along with the GNU C Library; if not, write to the Free
|
||||||
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
|
02111-1307 USA. */
|
||||||
|
|
||||||
/* This tells Alpha OSF/1 not to define a getopt prototype in <stdio.h>.
|
/* This tells Alpha OSF/1 not to define a getopt prototype in <stdio.h>.
|
||||||
Ditto for AIX 3.2 and <stdlib.h>. */
|
Ditto for AIX 3.2 and <stdlib.h>. */
|
||||||
@@ -27,13 +29,13 @@
|
|||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
#ifdef HAVE_CONFIG_H
|
||||||
# include <config.h>
|
# include <config.h>
|
||||||
#else
|
#endif
|
||||||
# if !defined __STDC__ || !__STDC__
|
|
||||||
|
#if !defined __STDC__ || !__STDC__
|
||||||
/* This is a separate conditional since some stdc systems
|
/* This is a separate conditional since some stdc systems
|
||||||
reject `defined (const)'. */
|
reject `defined (const)'. */
|
||||||
# ifndef const
|
# ifndef const
|
||||||
# define const
|
# define const
|
||||||
# endif
|
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -75,11 +77,12 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef _
|
#ifndef _
|
||||||
/* This is for other GNU distributions with internationalized messages.
|
/* This is for other GNU distributions with internationalized messages. */
|
||||||
When compiling libc, the _ macro is predefined. */
|
# if (HAVE_LIBINTL_H && ENABLE_NLS) || defined _LIBC
|
||||||
# ifdef HAVE_LIBINTL_H
|
|
||||||
# include <libintl.h>
|
# include <libintl.h>
|
||||||
# define _(msgid) gettext (msgid)
|
# ifndef _
|
||||||
|
# define _(msgid) gettext (msgid)
|
||||||
|
# endif
|
||||||
# else
|
# else
|
||||||
# define _(msgid) (msgid)
|
# define _(msgid) (msgid)
|
||||||
# endif
|
# endif
|
||||||
@@ -250,11 +253,13 @@ static int last_nonopt;
|
|||||||
/* Bash 2.0 gives us an environment variable containing flags
|
/* Bash 2.0 gives us an environment variable containing flags
|
||||||
indicating ARGV elements that should not be considered arguments. */
|
indicating ARGV elements that should not be considered arguments. */
|
||||||
|
|
||||||
|
#ifdef USE_NONOPTION_FLAGS
|
||||||
/* Defined in getopt_init.c */
|
/* Defined in getopt_init.c */
|
||||||
extern char *__getopt_nonoption_flags;
|
extern char *__getopt_nonoption_flags;
|
||||||
|
|
||||||
static int nonoption_flags_max_len;
|
static int nonoption_flags_max_len;
|
||||||
static int nonoption_flags_len;
|
static int nonoption_flags_len;
|
||||||
|
#endif
|
||||||
|
|
||||||
static int original_argc;
|
static int original_argc;
|
||||||
static char *const *original_argv;
|
static char *const *original_argv;
|
||||||
@@ -275,13 +280,17 @@ store_args_and_env (int argc, char *const *argv)
|
|||||||
text_set_element (__libc_subinit, store_args_and_env);
|
text_set_element (__libc_subinit, store_args_and_env);
|
||||||
# endif /* text_set_element */
|
# endif /* text_set_element */
|
||||||
|
|
||||||
# define SWAP_FLAGS(ch1, ch2) \
|
# ifdef USE_NONOPTION_FLAGS
|
||||||
|
# define SWAP_FLAGS(ch1, ch2) \
|
||||||
if (nonoption_flags_len > 0) \
|
if (nonoption_flags_len > 0) \
|
||||||
{ \
|
{ \
|
||||||
char __tmp = __getopt_nonoption_flags[ch1]; \
|
char __tmp = __getopt_nonoption_flags[ch1]; \
|
||||||
__getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2]; \
|
__getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2]; \
|
||||||
__getopt_nonoption_flags[ch2] = __tmp; \
|
__getopt_nonoption_flags[ch2] = __tmp; \
|
||||||
}
|
}
|
||||||
|
# else
|
||||||
|
# define SWAP_FLAGS(ch1, ch2)
|
||||||
|
# endif
|
||||||
#else /* !_LIBC */
|
#else /* !_LIBC */
|
||||||
# define SWAP_FLAGS(ch1, ch2)
|
# define SWAP_FLAGS(ch1, ch2)
|
||||||
#endif /* _LIBC */
|
#endif /* _LIBC */
|
||||||
@@ -313,7 +322,7 @@ exchange (argv)
|
|||||||
It leaves the longer segment in the right place overall,
|
It leaves the longer segment in the right place overall,
|
||||||
but it consists of two parts that need to be swapped next. */
|
but it consists of two parts that need to be swapped next. */
|
||||||
|
|
||||||
#ifdef _LIBC
|
#if defined _LIBC && defined USE_NONOPTION_FLAGS
|
||||||
/* First make sure the handling of the `__getopt_nonoption_flags'
|
/* First make sure the handling of the `__getopt_nonoption_flags'
|
||||||
string can work normally. Our top argument must be in the range
|
string can work normally. Our top argument must be in the range
|
||||||
of the string. */
|
of the string. */
|
||||||
@@ -417,7 +426,7 @@ _getopt_initialize (argc, argv, optstring)
|
|||||||
else
|
else
|
||||||
ordering = PERMUTE;
|
ordering = PERMUTE;
|
||||||
|
|
||||||
#ifdef _LIBC
|
#if defined _LIBC && defined USE_NONOPTION_FLAGS
|
||||||
if (posixly_correct == NULL
|
if (posixly_correct == NULL
|
||||||
&& argc == original_argc && argv == original_argv)
|
&& argc == original_argc && argv == original_argv)
|
||||||
{
|
{
|
||||||
@@ -515,6 +524,13 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only)
|
|||||||
int *longind;
|
int *longind;
|
||||||
int long_only;
|
int long_only;
|
||||||
{
|
{
|
||||||
|
int print_errors = opterr;
|
||||||
|
if (optstring[0] == ':')
|
||||||
|
print_errors = 0;
|
||||||
|
|
||||||
|
if (argc < 1)
|
||||||
|
return -1;
|
||||||
|
|
||||||
optarg = NULL;
|
optarg = NULL;
|
||||||
|
|
||||||
if (optind == 0 || !__getopt_initialized)
|
if (optind == 0 || !__getopt_initialized)
|
||||||
@@ -529,7 +545,7 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only)
|
|||||||
Either it does not have option syntax, or there is an environment flag
|
Either it does not have option syntax, or there is an environment flag
|
||||||
from the shell indicating it is not an option. The later information
|
from the shell indicating it is not an option. The later information
|
||||||
is only used when the used in the GNU libc. */
|
is only used when the used in the GNU libc. */
|
||||||
#ifdef _LIBC
|
#if defined _LIBC && defined USE_NONOPTION_FLAGS
|
||||||
# define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0' \
|
# define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0' \
|
||||||
|| (optind < nonoption_flags_len \
|
|| (optind < nonoption_flags_len \
|
||||||
&& __getopt_nonoption_flags[optind] == '1'))
|
&& __getopt_nonoption_flags[optind] == '1'))
|
||||||
@@ -664,14 +680,17 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only)
|
|||||||
pfound = p;
|
pfound = p;
|
||||||
indfound = option_index;
|
indfound = option_index;
|
||||||
}
|
}
|
||||||
else
|
else if (long_only
|
||||||
|
|| pfound->has_arg != p->has_arg
|
||||||
|
|| pfound->flag != p->flag
|
||||||
|
|| pfound->val != p->val)
|
||||||
/* Second or later nonexact match found. */
|
/* Second or later nonexact match found. */
|
||||||
ambig = 1;
|
ambig = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ambig && !exact)
|
if (ambig && !exact)
|
||||||
{
|
{
|
||||||
if (opterr)
|
if (print_errors)
|
||||||
fprintf (stderr, _("%s: option `%s' is ambiguous\n"),
|
fprintf (stderr, _("%s: option `%s' is ambiguous\n"),
|
||||||
argv[0], argv[optind]);
|
argv[0], argv[optind]);
|
||||||
nextchar += strlen (nextchar);
|
nextchar += strlen (nextchar);
|
||||||
@@ -692,7 +711,7 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only)
|
|||||||
optarg = nameend + 1;
|
optarg = nameend + 1;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (opterr)
|
if (print_errors)
|
||||||
{
|
{
|
||||||
if (argv[optind - 1][1] == '-')
|
if (argv[optind - 1][1] == '-')
|
||||||
/* --option */
|
/* --option */
|
||||||
@@ -718,7 +737,7 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only)
|
|||||||
optarg = argv[optind++];
|
optarg = argv[optind++];
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (opterr)
|
if (print_errors)
|
||||||
fprintf (stderr,
|
fprintf (stderr,
|
||||||
_("%s: option `%s' requires an argument\n"),
|
_("%s: option `%s' requires an argument\n"),
|
||||||
argv[0], argv[optind - 1]);
|
argv[0], argv[optind - 1]);
|
||||||
@@ -745,7 +764,7 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only)
|
|||||||
if (!long_only || argv[optind][1] == '-'
|
if (!long_only || argv[optind][1] == '-'
|
||||||
|| my_index (optstring, *nextchar) == NULL)
|
|| my_index (optstring, *nextchar) == NULL)
|
||||||
{
|
{
|
||||||
if (opterr)
|
if (print_errors)
|
||||||
{
|
{
|
||||||
if (argv[optind][1] == '-')
|
if (argv[optind][1] == '-')
|
||||||
/* --option */
|
/* --option */
|
||||||
@@ -775,7 +794,7 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only)
|
|||||||
|
|
||||||
if (temp == NULL || c == ':')
|
if (temp == NULL || c == ':')
|
||||||
{
|
{
|
||||||
if (opterr)
|
if (print_errors)
|
||||||
{
|
{
|
||||||
if (posixly_correct)
|
if (posixly_correct)
|
||||||
/* 1003.2 specifies the format of this message. */
|
/* 1003.2 specifies the format of this message. */
|
||||||
@@ -809,7 +828,7 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only)
|
|||||||
}
|
}
|
||||||
else if (optind == argc)
|
else if (optind == argc)
|
||||||
{
|
{
|
||||||
if (opterr)
|
if (print_errors)
|
||||||
{
|
{
|
||||||
/* 1003.2 specifies the format of this message. */
|
/* 1003.2 specifies the format of this message. */
|
||||||
fprintf (stderr, _("%s: option requires an argument -- %c\n"),
|
fprintf (stderr, _("%s: option requires an argument -- %c\n"),
|
||||||
@@ -858,7 +877,7 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only)
|
|||||||
}
|
}
|
||||||
if (ambig && !exact)
|
if (ambig && !exact)
|
||||||
{
|
{
|
||||||
if (opterr)
|
if (print_errors)
|
||||||
fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"),
|
fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"),
|
||||||
argv[0], argv[optind]);
|
argv[0], argv[optind]);
|
||||||
nextchar += strlen (nextchar);
|
nextchar += strlen (nextchar);
|
||||||
@@ -876,7 +895,7 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only)
|
|||||||
optarg = nameend + 1;
|
optarg = nameend + 1;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (opterr)
|
if (print_errors)
|
||||||
fprintf (stderr, _("\
|
fprintf (stderr, _("\
|
||||||
%s: option `-W %s' doesn't allow an argument\n"),
|
%s: option `-W %s' doesn't allow an argument\n"),
|
||||||
argv[0], pfound->name);
|
argv[0], pfound->name);
|
||||||
@@ -891,7 +910,7 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only)
|
|||||||
optarg = argv[optind++];
|
optarg = argv[optind++];
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (opterr)
|
if (print_errors)
|
||||||
fprintf (stderr,
|
fprintf (stderr,
|
||||||
_("%s: option `%s' requires an argument\n"),
|
_("%s: option `%s' requires an argument\n"),
|
||||||
argv[0], argv[optind - 1]);
|
argv[0], argv[optind - 1]);
|
||||||
@@ -938,12 +957,12 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only)
|
|||||||
}
|
}
|
||||||
else if (optind == argc)
|
else if (optind == argc)
|
||||||
{
|
{
|
||||||
if (opterr)
|
if (print_errors)
|
||||||
{
|
{
|
||||||
/* 1003.2 specifies the format of this message. */
|
/* 1003.2 specifies the format of this message. */
|
||||||
fprintf (stderr,
|
fprintf (stderr,
|
||||||
_("%s: option requires an argument -- %c\n"),
|
_("%s: option requires an argument -- %c\n"),
|
||||||
argv[0], c);
|
argv[0], c);
|
||||||
}
|
}
|
||||||
optopt = c;
|
optopt = c;
|
||||||
if (optstring[0] == ':')
|
if (optstring[0] == ':')
|
||||||
|
|||||||
+27
-16
@@ -1,21 +1,21 @@
|
|||||||
/* Declarations for getopt.
|
/* Declarations for getopt.
|
||||||
Copyright (C) 1989,90,91,92,93,94,96,97,98 Free Software Foundation, Inc.
|
Copyright (C) 1989-1994, 1996-1999, 2001 Free Software Foundation, Inc.
|
||||||
NOTE: The canonical source of this file is maintained with the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Bugs can be reported to [email protected].
|
|
||||||
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,
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
GNU General Public License for more details.
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU Lesser General Public
|
||||||
along with this program; if not, write to the Free Software
|
License along with the GNU C Library; if not, write to the Free
|
||||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
USA. */
|
02111-1307 USA. */
|
||||||
|
|
||||||
#ifndef _GETOPT_H
|
#ifndef _GETOPT_H
|
||||||
|
|
||||||
@@ -23,6 +23,17 @@
|
|||||||
# define _GETOPT_H 1
|
# define _GETOPT_H 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* If __GNU_LIBRARY__ is not already defined, either we are being used
|
||||||
|
standalone, or this is the first header included in the source file.
|
||||||
|
If we are being used with glibc, we need to include <features.h>, but
|
||||||
|
that does not exist if we are standalone. So: if __GNU_LIBRARY__ is
|
||||||
|
not defined, include <ctype.h>, which will pull in <features.h> for us
|
||||||
|
if it's from glibc. (Why ctype.h? It's guaranteed to exist and it
|
||||||
|
doesn't flood the namespace with stuff the way some other headers do.) */
|
||||||
|
#if !defined __GNU_LIBRARY__
|
||||||
|
# include <ctype.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
@@ -82,7 +93,7 @@ extern int optopt;
|
|||||||
|
|
||||||
struct option
|
struct option
|
||||||
{
|
{
|
||||||
# if defined __STDC__ && __STDC__
|
# if (defined __STDC__ && __STDC__) || defined __cplusplus
|
||||||
const char *name;
|
const char *name;
|
||||||
# else
|
# else
|
||||||
char *name;
|
char *name;
|
||||||
@@ -126,7 +137,7 @@ struct option
|
|||||||
arguments to the option '\0'. This behavior is specific to the GNU
|
arguments to the option '\0'. This behavior is specific to the GNU
|
||||||
`getopt'. */
|
`getopt'. */
|
||||||
|
|
||||||
#if defined __STDC__ && __STDC__
|
#if (defined __STDC__ && __STDC__) || defined __cplusplus
|
||||||
# ifdef __GNU_LIBRARY__
|
# ifdef __GNU_LIBRARY__
|
||||||
/* Many other libraries have conflicting prototypes for getopt, with
|
/* Many other libraries have conflicting prototypes for getopt, with
|
||||||
differences in the consts, in stdlib.h. To avoid compilation
|
differences in the consts, in stdlib.h. To avoid compilation
|
||||||
|
|||||||
+16
-16
@@ -1,26 +1,29 @@
|
|||||||
/* getopt_long and getopt_long_only entry points for GNU getopt.
|
/* getopt_long and getopt_long_only entry points for GNU getopt.
|
||||||
Copyright (C) 1987,88,89,90,91,92,93,94,96,97,98
|
Copyright (C) 1987,88,89,90,91,92,93,94,96,97,98
|
||||||
Free Software Foundation, Inc.
|
Free Software Foundation, Inc.
|
||||||
NOTE: The canonical source of this file is maintained with the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Bugs can be reported to [email protected].
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify it
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
under the terms of the GNU General Public License as published by the
|
modify it under the terms of the GNU Lesser General Public
|
||||||
Free Software Foundation; either version 2, or (at your option) any
|
License as published by the Free Software Foundation; either
|
||||||
later version.
|
version 2.1 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
GNU General Public License for more details.
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU Lesser General Public
|
||||||
along with this program; if not, write to the Free Software Foundation,
|
License along with the GNU C Library; if not, write to the Free
|
||||||
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
|
02111-1307 USA. */
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
#ifdef HAVE_CONFIG_H
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
#else
|
#endif
|
||||||
|
|
||||||
|
#include "getopt.h"
|
||||||
|
|
||||||
#if !defined __STDC__ || !__STDC__
|
#if !defined __STDC__ || !__STDC__
|
||||||
/* This is a separate conditional since some stdc systems
|
/* This is a separate conditional since some stdc systems
|
||||||
reject `defined (const)'. */
|
reject `defined (const)'. */
|
||||||
@@ -28,9 +31,6 @@
|
|||||||
#define const
|
#define const
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "getopt.h"
|
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
|
|||||||
+94
-75
@@ -1,26 +1,25 @@
|
|||||||
/* obstack.c - subroutines used implicitly by object stack macros
|
/* obstack.c - subroutines used implicitly by object stack macros
|
||||||
Copyright (C) 1988-1994,96,97,98,99,2000 Free Software Foundation, Inc.
|
Copyright (C) 1988-1994,96,97,98,99,2000,2001 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of the GNU C Library. Its master source is NOT part of
|
This file is part of the GNU C Library. Its master source is NOT part of
|
||||||
the C library, however. The master source lives in /gd/gnu/lib.
|
the C library, however. The master source lives in /gd/gnu/lib.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
modify it under the terms of the GNU Library General Public License as
|
modify it under the terms of the GNU Lesser General Public
|
||||||
published by the Free Software Foundation; either version 2 of the
|
License as published by the Free Software Foundation; either
|
||||||
License, or (at your option) any later version.
|
version 2.1 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
The GNU C Library is distributed in the hope that it will be useful,
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
Library General Public License for more details.
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU Library General Public
|
You should have received a copy of the GNU Lesser General Public
|
||||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
License along with the GNU C Library; if not, write to the Free
|
||||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
Boston, MA 02111-1307, USA. */
|
02111-1307 USA. */
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
#ifdef HAVE_CONFIG_H
|
||||||
#include <config.h>
|
# include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "obstack.h"
|
#include "obstack.h"
|
||||||
@@ -40,40 +39,43 @@
|
|||||||
files, it is simpler to just do this in the source for each such file. */
|
files, it is simpler to just do this in the source for each such file. */
|
||||||
|
|
||||||
#include <stdio.h> /* Random thing to get __GNU_LIBRARY__. */
|
#include <stdio.h> /* Random thing to get __GNU_LIBRARY__. */
|
||||||
#if !defined (_LIBC) && defined (__GNU_LIBRARY__) && __GNU_LIBRARY__ > 1
|
#if !defined _LIBC && defined __GNU_LIBRARY__ && __GNU_LIBRARY__ > 1
|
||||||
#include <gnu-versions.h>
|
# include <gnu-versions.h>
|
||||||
#if _GNU_OBSTACK_INTERFACE_VERSION == OBSTACK_INTERFACE_VERSION
|
# if _GNU_OBSTACK_INTERFACE_VERSION == OBSTACK_INTERFACE_VERSION
|
||||||
#define ELIDE_CODE
|
# define ELIDE_CODE
|
||||||
#endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined _LIBC && defined USE_IN_LIBIO
|
||||||
|
# include <wchar.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef ELIDE_CODE
|
#ifndef ELIDE_CODE
|
||||||
|
|
||||||
|
|
||||||
#if defined (__STDC__) && __STDC__
|
# if defined __STDC__ && __STDC__
|
||||||
#define POINTER void *
|
# define POINTER void *
|
||||||
#else
|
# else
|
||||||
#define POINTER char *
|
# define POINTER char *
|
||||||
#endif
|
# endif
|
||||||
|
|
||||||
/* Determine default alignment. */
|
/* Determine default alignment. */
|
||||||
struct fooalign {char x; double d;};
|
struct fooalign {char x; double d;};
|
||||||
#define DEFAULT_ALIGNMENT \
|
# define DEFAULT_ALIGNMENT \
|
||||||
((PTR_INT_TYPE) ((char *) &((struct fooalign *) 0)->d - (char *) 0))
|
((PTR_INT_TYPE) ((char *) &((struct fooalign *) 0)->d - (char *) 0))
|
||||||
/* If malloc were really smart, it would round addresses to DEFAULT_ALIGNMENT.
|
/* If malloc were really smart, it would round addresses to DEFAULT_ALIGNMENT.
|
||||||
But in fact it might be less smart and round addresses to as much as
|
But in fact it might be less smart and round addresses to as much as
|
||||||
DEFAULT_ROUNDING. So we prepare for it to do that. */
|
DEFAULT_ROUNDING. So we prepare for it to do that. */
|
||||||
union fooround {long x; double d;};
|
union fooround {long x; double d;};
|
||||||
#define DEFAULT_ROUNDING (sizeof (union fooround))
|
# define DEFAULT_ROUNDING (sizeof (union fooround))
|
||||||
|
|
||||||
/* When we copy a long block of data, this is the unit to do it with.
|
/* When we copy a long block of data, this is the unit to do it with.
|
||||||
On some machines, copying successive ints does not work;
|
On some machines, copying successive ints does not work;
|
||||||
in such a case, redefine COPYING_UNIT to `long' (if that works)
|
in such a case, redefine COPYING_UNIT to `long' (if that works)
|
||||||
or `char' as a last resort. */
|
or `char' as a last resort. */
|
||||||
#ifndef COPYING_UNIT
|
# ifndef COPYING_UNIT
|
||||||
#define COPYING_UNIT int
|
# define COPYING_UNIT int
|
||||||
#endif
|
# endif
|
||||||
|
|
||||||
|
|
||||||
/* The functions allocating more room by calling `obstack_chunk_alloc'
|
/* The functions allocating more room by calling `obstack_chunk_alloc'
|
||||||
@@ -82,21 +84,21 @@ union fooround {long x; double d;};
|
|||||||
abort gracefully or use longjump - but shouldn't return. This
|
abort gracefully or use longjump - but shouldn't return. This
|
||||||
variable by default points to the internal function
|
variable by default points to the internal function
|
||||||
`print_and_abort'. */
|
`print_and_abort'. */
|
||||||
#if defined (__STDC__) && __STDC__
|
# if defined __STDC__ && __STDC__
|
||||||
static void print_and_abort (void);
|
static void print_and_abort (void);
|
||||||
void (*obstack_alloc_failed_handler) (void) = print_and_abort;
|
void (*obstack_alloc_failed_handler) (void) = print_and_abort;
|
||||||
#else
|
# else
|
||||||
static void print_and_abort ();
|
static void print_and_abort ();
|
||||||
void (*obstack_alloc_failed_handler) () = print_and_abort;
|
void (*obstack_alloc_failed_handler) () = print_and_abort;
|
||||||
#endif
|
# endif
|
||||||
|
|
||||||
/* Exit value used when `print_and_abort' is used. */
|
/* Exit value used when `print_and_abort' is used. */
|
||||||
#if defined __GNU_LIBRARY__ || defined HAVE_STDLIB_H
|
# if defined __GNU_LIBRARY__ || defined HAVE_STDLIB_H
|
||||||
#include <stdlib.h>
|
# include <stdlib.h>
|
||||||
#endif
|
# endif
|
||||||
#ifndef EXIT_FAILURE
|
# ifndef EXIT_FAILURE
|
||||||
#define EXIT_FAILURE 1
|
# define EXIT_FAILURE 1
|
||||||
#endif
|
# endif
|
||||||
int obstack_exit_failure = EXIT_FAILURE;
|
int obstack_exit_failure = EXIT_FAILURE;
|
||||||
|
|
||||||
/* The non-GNU-C macros copy the obstack into this global variable
|
/* The non-GNU-C macros copy the obstack into this global variable
|
||||||
@@ -110,33 +112,33 @@ struct obstack *_obstack;
|
|||||||
For free, do not use ?:, since some compilers, like the MIPS compilers,
|
For free, do not use ?:, since some compilers, like the MIPS compilers,
|
||||||
do not allow (expr) ? void : void. */
|
do not allow (expr) ? void : void. */
|
||||||
|
|
||||||
#if defined (__STDC__) && __STDC__
|
# if defined __STDC__ && __STDC__
|
||||||
#define CALL_CHUNKFUN(h, size) \
|
# define CALL_CHUNKFUN(h, size) \
|
||||||
(((h) -> use_extra_arg) \
|
(((h) -> use_extra_arg) \
|
||||||
? (*(h)->chunkfun) ((h)->extra_arg, (size)) \
|
? (*(h)->chunkfun) ((h)->extra_arg, (size)) \
|
||||||
: (*(struct _obstack_chunk *(*) (long)) (h)->chunkfun) ((size)))
|
: (*(struct _obstack_chunk *(*) (long)) (h)->chunkfun) ((size)))
|
||||||
|
|
||||||
#define CALL_FREEFUN(h, old_chunk) \
|
# define CALL_FREEFUN(h, old_chunk) \
|
||||||
do { \
|
do { \
|
||||||
if ((h) -> use_extra_arg) \
|
if ((h) -> use_extra_arg) \
|
||||||
(*(h)->freefun) ((h)->extra_arg, (old_chunk)); \
|
(*(h)->freefun) ((h)->extra_arg, (old_chunk)); \
|
||||||
else \
|
else \
|
||||||
(*(void (*) (void *)) (h)->freefun) ((old_chunk)); \
|
(*(void (*) (void *)) (h)->freefun) ((old_chunk)); \
|
||||||
} while (0)
|
} while (0)
|
||||||
#else
|
# else
|
||||||
#define CALL_CHUNKFUN(h, size) \
|
# define CALL_CHUNKFUN(h, size) \
|
||||||
(((h) -> use_extra_arg) \
|
(((h) -> use_extra_arg) \
|
||||||
? (*(h)->chunkfun) ((h)->extra_arg, (size)) \
|
? (*(h)->chunkfun) ((h)->extra_arg, (size)) \
|
||||||
: (*(struct _obstack_chunk *(*) ()) (h)->chunkfun) ((size)))
|
: (*(struct _obstack_chunk *(*) ()) (h)->chunkfun) ((size)))
|
||||||
|
|
||||||
#define CALL_FREEFUN(h, old_chunk) \
|
# define CALL_FREEFUN(h, old_chunk) \
|
||||||
do { \
|
do { \
|
||||||
if ((h) -> use_extra_arg) \
|
if ((h) -> use_extra_arg) \
|
||||||
(*(h)->freefun) ((h)->extra_arg, (old_chunk)); \
|
(*(h)->freefun) ((h)->extra_arg, (old_chunk)); \
|
||||||
else \
|
else \
|
||||||
(*(void (*) ()) (h)->freefun) ((old_chunk)); \
|
(*(void (*) ()) (h)->freefun) ((old_chunk)); \
|
||||||
} while (0)
|
} while (0)
|
||||||
#endif
|
# endif
|
||||||
|
|
||||||
|
|
||||||
/* Initialize an obstack H for use. Specify chunk size SIZE (0 means default).
|
/* Initialize an obstack H for use. Specify chunk size SIZE (0 means default).
|
||||||
@@ -152,13 +154,13 @@ _obstack_begin (h, size, alignment, chunkfun, freefun)
|
|||||||
struct obstack *h;
|
struct obstack *h;
|
||||||
int size;
|
int size;
|
||||||
int alignment;
|
int alignment;
|
||||||
#if defined (__STDC__) && __STDC__
|
# if defined __STDC__ && __STDC__
|
||||||
POINTER (*chunkfun) (long);
|
POINTER (*chunkfun) (long);
|
||||||
void (*freefun) (void *);
|
void (*freefun) (void *);
|
||||||
#else
|
# else
|
||||||
POINTER (*chunkfun) ();
|
POINTER (*chunkfun) ();
|
||||||
void (*freefun) ();
|
void (*freefun) ();
|
||||||
#endif
|
# endif
|
||||||
{
|
{
|
||||||
register struct _obstack_chunk *chunk; /* points to new chunk */
|
register struct _obstack_chunk *chunk; /* points to new chunk */
|
||||||
|
|
||||||
@@ -181,13 +183,13 @@ _obstack_begin (h, size, alignment, chunkfun, freefun)
|
|||||||
size = 4096 - extra;
|
size = 4096 - extra;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined (__STDC__) && __STDC__
|
# if defined __STDC__ && __STDC__
|
||||||
h->chunkfun = (struct _obstack_chunk * (*)(void *, long)) chunkfun;
|
h->chunkfun = (struct _obstack_chunk * (*)(void *, long)) chunkfun;
|
||||||
h->freefun = (void (*) (void *, struct _obstack_chunk *)) freefun;
|
h->freefun = (void (*) (void *, struct _obstack_chunk *)) freefun;
|
||||||
#else
|
# else
|
||||||
h->chunkfun = (struct _obstack_chunk * (*)()) chunkfun;
|
h->chunkfun = (struct _obstack_chunk * (*)()) chunkfun;
|
||||||
h->freefun = freefun;
|
h->freefun = freefun;
|
||||||
#endif
|
# endif
|
||||||
h->chunk_size = size;
|
h->chunk_size = size;
|
||||||
h->alignment_mask = alignment - 1;
|
h->alignment_mask = alignment - 1;
|
||||||
h->use_extra_arg = 0;
|
h->use_extra_arg = 0;
|
||||||
@@ -210,13 +212,13 @@ _obstack_begin_1 (h, size, alignment, chunkfun, freefun, arg)
|
|||||||
struct obstack *h;
|
struct obstack *h;
|
||||||
int size;
|
int size;
|
||||||
int alignment;
|
int alignment;
|
||||||
#if defined (__STDC__) && __STDC__
|
# if defined __STDC__ && __STDC__
|
||||||
POINTER (*chunkfun) (POINTER, long);
|
POINTER (*chunkfun) (POINTER, long);
|
||||||
void (*freefun) (POINTER, POINTER);
|
void (*freefun) (POINTER, POINTER);
|
||||||
#else
|
# else
|
||||||
POINTER (*chunkfun) ();
|
POINTER (*chunkfun) ();
|
||||||
void (*freefun) ();
|
void (*freefun) ();
|
||||||
#endif
|
# endif
|
||||||
POINTER arg;
|
POINTER arg;
|
||||||
{
|
{
|
||||||
register struct _obstack_chunk *chunk; /* points to new chunk */
|
register struct _obstack_chunk *chunk; /* points to new chunk */
|
||||||
@@ -240,13 +242,13 @@ _obstack_begin_1 (h, size, alignment, chunkfun, freefun, arg)
|
|||||||
size = 4096 - extra;
|
size = 4096 - extra;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(__STDC__) && __STDC__
|
# if defined __STDC__ && __STDC__
|
||||||
h->chunkfun = (struct _obstack_chunk * (*)(void *,long)) chunkfun;
|
h->chunkfun = (struct _obstack_chunk * (*)(void *,long)) chunkfun;
|
||||||
h->freefun = (void (*) (void *, struct _obstack_chunk *)) freefun;
|
h->freefun = (void (*) (void *, struct _obstack_chunk *)) freefun;
|
||||||
#else
|
# else
|
||||||
h->chunkfun = (struct _obstack_chunk * (*)()) chunkfun;
|
h->chunkfun = (struct _obstack_chunk * (*)()) chunkfun;
|
||||||
h->freefun = freefun;
|
h->freefun = freefun;
|
||||||
#endif
|
# endif
|
||||||
h->chunk_size = size;
|
h->chunk_size = size;
|
||||||
h->alignment_mask = alignment - 1;
|
h->alignment_mask = alignment - 1;
|
||||||
h->extra_arg = arg;
|
h->extra_arg = arg;
|
||||||
@@ -341,11 +343,11 @@ _obstack_newchunk (h, length)
|
|||||||
This is here for debugging.
|
This is here for debugging.
|
||||||
If you use it in a program, you are probably losing. */
|
If you use it in a program, you are probably losing. */
|
||||||
|
|
||||||
#if defined (__STDC__) && __STDC__
|
# if defined __STDC__ && __STDC__
|
||||||
/* Suppress -Wmissing-prototypes warning. We don't want to declare this in
|
/* Suppress -Wmissing-prototypes warning. We don't want to declare this in
|
||||||
obstack.h because it is just for debugging. */
|
obstack.h because it is just for debugging. */
|
||||||
int _obstack_allocated_p (struct obstack *h, POINTER obj);
|
int _obstack_allocated_p (struct obstack *h, POINTER obj);
|
||||||
#endif
|
# endif
|
||||||
|
|
||||||
int
|
int
|
||||||
_obstack_allocated_p (h, obj)
|
_obstack_allocated_p (h, obj)
|
||||||
@@ -370,7 +372,7 @@ _obstack_allocated_p (h, obj)
|
|||||||
/* Free objects in obstack H, including OBJ and everything allocate
|
/* Free objects in obstack H, including OBJ and everything allocate
|
||||||
more recently than OBJ. If OBJ is zero, free everything in H. */
|
more recently than OBJ. If OBJ is zero, free everything in H. */
|
||||||
|
|
||||||
#undef obstack_free
|
# undef obstack_free
|
||||||
|
|
||||||
/* This function has two names with identical definitions.
|
/* This function has two names with identical definitions.
|
||||||
This is the first one, called from non-ANSI code. */
|
This is the first one, called from non-ANSI code. */
|
||||||
@@ -456,37 +458,54 @@ _obstack_memory_used (h)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Define the error handler. */
|
/* Define the error handler. */
|
||||||
#ifndef _
|
# ifndef _
|
||||||
# if defined HAVE_LIBINTL_H || defined _LIBC
|
# if (HAVE_LIBINTL_H && ENABLE_NLS) || defined _LIBC
|
||||||
# include <libintl.h>
|
# include <libintl.h>
|
||||||
# ifndef _
|
# ifndef _
|
||||||
# define _(Str) gettext (Str)
|
# define _(Str) gettext (Str)
|
||||||
|
# endif
|
||||||
|
# else
|
||||||
|
# define _(Str) (Str)
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
# if defined _LIBC && defined USE_IN_LIBIO
|
||||||
|
# include <libio/iolibio.h>
|
||||||
|
# define fputs(s, f) _IO_fputs (s, f)
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifndef __attribute__
|
||||||
|
/* This feature is available in gcc versions 2.5 and later. */
|
||||||
|
# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5)
|
||||||
|
# define __attribute__(Spec) /* empty */
|
||||||
# endif
|
# endif
|
||||||
# else
|
|
||||||
# define _(Str) (Str)
|
|
||||||
# endif
|
# endif
|
||||||
#endif
|
|
||||||
#if defined _LIBC && defined USE_IN_LIBIO
|
|
||||||
# include <libio/iolibio.h>
|
|
||||||
# define fputs(s, f) _IO_fputs (s, f)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
__attribute__ ((noreturn))
|
||||||
print_and_abort ()
|
print_and_abort ()
|
||||||
{
|
{
|
||||||
fputs (_("memory exhausted"), stderr);
|
/* Don't change any of these strings. Yes, it would be possible to add
|
||||||
fputc ('\n', stderr);
|
the newline to the string and use fputs or so. But this must not
|
||||||
|
happen because the "memory exhausted" message appears in other places
|
||||||
|
like this and the translation should be reused instead of creating
|
||||||
|
a very similar string which requires a separate translation. */
|
||||||
|
# if defined _LIBC && defined USE_IN_LIBIO
|
||||||
|
if (_IO_fwide (stderr, 0) > 0)
|
||||||
|
__fwprintf (stderr, L"%s\n", _("memory exhausted"));
|
||||||
|
else
|
||||||
|
# endif
|
||||||
|
fprintf (stderr, "%s\n", _("memory exhausted"));
|
||||||
exit (obstack_exit_failure);
|
exit (obstack_exit_failure);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
# if 0
|
||||||
/* These are now turned off because the applications do not use it
|
/* These are now turned off because the applications do not use it
|
||||||
and it uses bcopy via obstack_grow, which causes trouble on sysV. */
|
and it uses bcopy via obstack_grow, which causes trouble on sysV. */
|
||||||
|
|
||||||
/* Now define the functional versions of the obstack macros.
|
/* Now define the functional versions of the obstack macros.
|
||||||
Define them to simply use the corresponding macros to do the job. */
|
Define them to simply use the corresponding macros to do the job. */
|
||||||
|
|
||||||
#if defined (__STDC__) && __STDC__
|
# if defined __STDC__ && __STDC__
|
||||||
/* These function definitions do not work with non-ANSI preprocessors;
|
/* These function definitions do not work with non-ANSI preprocessors;
|
||||||
they won't pass through the macro names in parentheses. */
|
they won't pass through the macro names in parentheses. */
|
||||||
|
|
||||||
@@ -597,8 +616,8 @@ POINTER (obstack_copy0) (obstack, address, length)
|
|||||||
return obstack_copy0 (obstack, address, length);
|
return obstack_copy0 (obstack, address, length);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* __STDC__ */
|
# endif /* __STDC__ */
|
||||||
|
|
||||||
#endif /* 0 */
|
# endif /* 0 */
|
||||||
|
|
||||||
#endif /* !ELIDE_CODE */
|
#endif /* !ELIDE_CODE */
|
||||||
|
|||||||
+11
-8
@@ -4,20 +4,23 @@
|
|||||||
This file is part of the GNU C Library. Its master source is NOT part of
|
This file is part of the GNU C Library. Its master source is NOT part of
|
||||||
the C library, however. The master source lives in /gd/gnu/lib.
|
the C library, however. The master source lives in /gd/gnu/lib.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
NOTE: The canonical source of this file is maintained with the GNU C Library.
|
||||||
modify it under the terms of the GNU Library General Public License as
|
Bugs can be reported to [email protected].
|
||||||
published by the Free Software Foundation; either version 2 of the
|
|
||||||
License, or (at your option) any later version.
|
|
||||||
|
|
||||||
The GNU C Library is distributed in the hope that it will be useful,
|
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
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
Library General Public License for more details.
|
Library General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU Library General Public
|
You should have received a copy of the GNU Library General Public
|
||||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
License along with this program; if not, write to the Free Software
|
||||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||||
Boston, MA 02111-1307, USA. */
|
USA. */
|
||||||
|
|
||||||
/* Summary:
|
/* Summary:
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,9 @@
|
|||||||
# include <config.h>
|
# include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if HAVE_STDDEF_H
|
||||||
|
# include <stddef.h> /* For the definition of size_t on windows w/MSVC. */
|
||||||
|
#endif
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <quotearg.h>
|
#include <quotearg.h>
|
||||||
#include <quote.h>
|
#include <quote.h>
|
||||||
|
|||||||
+23
-10
@@ -44,9 +44,15 @@
|
|||||||
#ifndef CHAR_BIT
|
#ifndef CHAR_BIT
|
||||||
# define CHAR_BIT 8
|
# define CHAR_BIT 8
|
||||||
#endif
|
#endif
|
||||||
|
#ifndef SIZE_MAX
|
||||||
|
# define SIZE_MAX ((size_t) -1)
|
||||||
|
#endif
|
||||||
#ifndef UCHAR_MAX
|
#ifndef UCHAR_MAX
|
||||||
# define UCHAR_MAX ((unsigned char) -1)
|
# define UCHAR_MAX ((unsigned char) -1)
|
||||||
#endif
|
#endif
|
||||||
|
#ifndef UINT_MAX
|
||||||
|
# define UINT_MAX ((unsigned int) -1)
|
||||||
|
#endif
|
||||||
|
|
||||||
#if HAVE_C_BACKSLASH_A
|
#if HAVE_C_BACKSLASH_A
|
||||||
# define ALERT_CHAR '\a'
|
# define ALERT_CHAR '\a'
|
||||||
@@ -539,6 +545,7 @@ quotearg_n_options (int n, char const *arg,
|
|||||||
one small component of a "memory exhausted" message in slot 0. */
|
one small component of a "memory exhausted" message in slot 0. */
|
||||||
static char slot0[256];
|
static char slot0[256];
|
||||||
static unsigned int nslots = 1;
|
static unsigned int nslots = 1;
|
||||||
|
unsigned int n0 = n;
|
||||||
struct slotvec
|
struct slotvec
|
||||||
{
|
{
|
||||||
size_t size;
|
size_t size;
|
||||||
@@ -547,20 +554,26 @@ quotearg_n_options (int n, char const *arg,
|
|||||||
static struct slotvec slotvec0 = {sizeof slot0, slot0};
|
static struct slotvec slotvec0 = {sizeof slot0, slot0};
|
||||||
static struct slotvec *slotvec = &slotvec0;
|
static struct slotvec *slotvec = &slotvec0;
|
||||||
|
|
||||||
if (nslots <= n)
|
if (n < 0)
|
||||||
|
abort ();
|
||||||
|
|
||||||
|
if (nslots <= n0)
|
||||||
{
|
{
|
||||||
int n1 = n + 1;
|
unsigned int n1 = n0 + 1;
|
||||||
size_t s = n1 * sizeof (struct slotvec);
|
size_t s = n1 * sizeof *slotvec;
|
||||||
if (! (0 < n1 && n1 == s / sizeof (struct slotvec)))
|
|
||||||
abort ();
|
if (SIZE_MAX / UINT_MAX <= sizeof *slotvec
|
||||||
|
&& n1 != s / sizeof *slotvec)
|
||||||
|
xalloc_die ();
|
||||||
|
|
||||||
if (slotvec == &slotvec0)
|
if (slotvec == &slotvec0)
|
||||||
{
|
{
|
||||||
slotvec = (struct slotvec *) xmalloc (sizeof (struct slotvec));
|
slotvec = (struct slotvec *) xmalloc (sizeof *slotvec);
|
||||||
*slotvec = slotvec0;
|
*slotvec = slotvec0;
|
||||||
}
|
}
|
||||||
slotvec = (struct slotvec *) xrealloc (slotvec, s);
|
slotvec = (struct slotvec *) xrealloc (slotvec, s);
|
||||||
memset (slotvec + nslots, 0, (n1 - nslots) * sizeof (struct slotvec));
|
memset (slotvec + nslots, 0, (n1 - nslots) * sizeof *slotvec);
|
||||||
nslots = n;
|
nslots = n1;
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
@@ -580,7 +593,7 @@ quotearg_n_options (int n, char const *arg,
|
|||||||
}
|
}
|
||||||
|
|
||||||
char *
|
char *
|
||||||
quotearg_n (unsigned int n, char const *arg)
|
quotearg_n (int n, char const *arg)
|
||||||
{
|
{
|
||||||
return quotearg_n_options (n, arg, &default_quoting_options);
|
return quotearg_n_options (n, arg, &default_quoting_options);
|
||||||
}
|
}
|
||||||
@@ -592,7 +605,7 @@ quotearg (char const *arg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
char *
|
char *
|
||||||
quotearg_n_style (unsigned int n, enum quoting_style s, char const *arg)
|
quotearg_n_style (int n, enum quoting_style s, char const *arg)
|
||||||
{
|
{
|
||||||
struct quoting_options o;
|
struct quoting_options o;
|
||||||
o.style = s;
|
o.style = s;
|
||||||
|
|||||||
+2
-3
@@ -89,7 +89,7 @@ size_t quotearg_buffer PARAMS ((char *buffer, size_t buffersize,
|
|||||||
The returned value points to static storage that can be
|
The returned value points to static storage that can be
|
||||||
reused by the next call to this function with the same value of N.
|
reused by the next call to this function with the same value of N.
|
||||||
N must be nonnegative. */
|
N must be nonnegative. */
|
||||||
char *quotearg_n PARAMS ((unsigned int n, char const *arg));
|
char *quotearg_n PARAMS ((int n, char const *arg));
|
||||||
|
|
||||||
/* Equivalent to quotearg_n (0, ARG). */
|
/* Equivalent to quotearg_n (0, ARG). */
|
||||||
char *quotearg PARAMS ((char const *arg));
|
char *quotearg PARAMS ((char const *arg));
|
||||||
@@ -97,8 +97,7 @@ char *quotearg PARAMS ((char const *arg));
|
|||||||
/* Use style S and storage slot N to return a quoted version of the string ARG.
|
/* Use style S and storage slot N to return a quoted version of the string ARG.
|
||||||
This is like quotearg_n (N, ARG), except that it uses S with no other
|
This is like quotearg_n (N, ARG), except that it uses S with no other
|
||||||
options to specify the quoting method. */
|
options to specify the quoting method. */
|
||||||
char *quotearg_n_style PARAMS ((unsigned int n, enum quoting_style s,
|
char *quotearg_n_style PARAMS ((int n, enum quoting_style s, char const *arg));
|
||||||
char const *arg));
|
|
||||||
|
|
||||||
/* Equivalent to quotearg_n_style (0, S, ARG). */
|
/* Equivalent to quotearg_n_style (0, S, ARG). */
|
||||||
char *quotearg_style PARAMS ((enum quoting_style s, char const *arg));
|
char *quotearg_style PARAMS ((enum quoting_style s, char const *arg));
|
||||||
|
|||||||
+2
-2
@@ -1,5 +1,5 @@
|
|||||||
/* Find the length of STRING, but scan at most MAXLEN characters.
|
/* Find the length of STRING, but scan at most MAXLEN characters.
|
||||||
Copyright (C) 1996, 1997, 1998, 2000 Free Software Foundation, Inc.
|
Copyright (C) 1996, 1997, 1998, 2000, 2001 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@@ -51,7 +51,7 @@ size_t
|
|||||||
__strnlen (const char *string, size_t maxlen)
|
__strnlen (const char *string, size_t maxlen)
|
||||||
{
|
{
|
||||||
const char *end = memchr (string, '\0', maxlen);
|
const char *end = memchr (string, '\0', maxlen);
|
||||||
return end ? end - string : maxlen;
|
return end ? (size_t) (end - string) : maxlen;
|
||||||
}
|
}
|
||||||
#ifdef weak_alias
|
#ifdef weak_alias
|
||||||
weak_alias (__strnlen, strnlen)
|
weak_alias (__strnlen, strnlen)
|
||||||
|
|||||||
+2
-2
@@ -47,11 +47,11 @@ void free ();
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef HAVE_DONE_WORKING_MALLOC_CHECK
|
#ifndef HAVE_DONE_WORKING_MALLOC_CHECK
|
||||||
you must run the autoconf test for a properly working malloc -- see malloc.m4
|
"you must run the autoconf test for a properly working malloc -- see malloc.m4"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef HAVE_DONE_WORKING_REALLOC_CHECK
|
#ifndef HAVE_DONE_WORKING_REALLOC_CHECK
|
||||||
you must run the autoconf test for a properly working realloc -- see realloc.m4
|
"you must run the autoconf test for a properly working realloc --see realloc.m4"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Exit value when the requested amount of memory is not available.
|
/* Exit value when the requested amount of memory is not available.
|
||||||
|
|||||||
+2
-10
@@ -1,5 +1,5 @@
|
|||||||
/* xstrdup.c -- copy a string with out of memory checking
|
/* xstrdup.c -- copy a string with out of memory checking
|
||||||
Copyright (C) 1990, 1996, 1998 Free Software Foundation, Inc.
|
Copyright (C) 1990, 1996, 1998, 2001 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
@@ -19,14 +19,6 @@
|
|||||||
# include <config.h>
|
# include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef PARAMS
|
|
||||||
# if defined PROTOTYPES || (defined __STDC__ && __STDC__)
|
|
||||||
# define PARAMS(Args) Args
|
|
||||||
# else
|
|
||||||
# define PARAMS(Args) ()
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if STDC_HEADERS || HAVE_STRING_H
|
#if STDC_HEADERS || HAVE_STRING_H
|
||||||
# include <string.h>
|
# include <string.h>
|
||||||
#else
|
#else
|
||||||
@@ -35,7 +27,7 @@
|
|||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
||||||
char *xmalloc PARAMS ((size_t n));
|
#include "xalloc.h"
|
||||||
|
|
||||||
/* Return a newly allocated copy of STRING. */
|
/* Return a newly allocated copy of STRING. */
|
||||||
|
|
||||||
|
|||||||
+4
-5
@@ -1,4 +1,5 @@
|
|||||||
# Makefile.in generated automatically by automake 1.5a from Makefile.am.
|
# Makefile.in generated by automake 1.5a from Makefile.am.
|
||||||
|
# @configure_input@
|
||||||
|
|
||||||
# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
|
# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
|
||||||
# Free Software Foundation, Inc.
|
# Free Software Foundation, Inc.
|
||||||
@@ -83,8 +84,8 @@ INTLBISON = @INTLBISON@
|
|||||||
INTLLIBS = @INTLLIBS@
|
INTLLIBS = @INTLLIBS@
|
||||||
INTLOBJS = @INTLOBJS@
|
INTLOBJS = @INTLOBJS@
|
||||||
INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
|
INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
|
||||||
|
LIB = @LIB@
|
||||||
LIBICONV = @LIBICONV@
|
LIBICONV = @LIBICONV@
|
||||||
LIBOBJS = @LIBOBJS@
|
|
||||||
MKINSTALLDIRS = @MKINSTALLDIRS@
|
MKINSTALLDIRS = @MKINSTALLDIRS@
|
||||||
MSGFMT = @MSGFMT@
|
MSGFMT = @MSGFMT@
|
||||||
PACKAGE = @PACKAGE@
|
PACKAGE = @PACKAGE@
|
||||||
@@ -132,9 +133,7 @@ $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
|
|||||||
cd $(top_srcdir) && \
|
cd $(top_srcdir) && \
|
||||||
$(AUTOMAKE) --gnu m4/Makefile
|
$(AUTOMAKE) --gnu m4/Makefile
|
||||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||||
cd $(top_builddir) && \
|
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
|
||||||
CONFIG_HEADERS= CONFIG_LINKS= \
|
|
||||||
CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status
|
|
||||||
uninstall-info-am:
|
uninstall-info-am:
|
||||||
tags: TAGS
|
tags: TAGS
|
||||||
TAGS:
|
TAGS:
|
||||||
|
|||||||
+2
-2
@@ -1,8 +1,8 @@
|
|||||||
#serial 3
|
#serial 4
|
||||||
|
|
||||||
dnl From Paul Eggert.
|
dnl From Paul Eggert.
|
||||||
|
|
||||||
AC_DEFUN(AC_C_BACKSLASH_A,
|
AC_DEFUN([AC_C_BACKSLASH_A],
|
||||||
[
|
[
|
||||||
AC_CACHE_CHECK([whether backslash-a works in strings], ac_cv_c_backslash_a,
|
AC_CACHE_CHECK([whether backslash-a works in strings], ac_cv_c_backslash_a,
|
||||||
[AC_TRY_COMPILE([],
|
[AC_TRY_COMPILE([],
|
||||||
|
|||||||
+5
-4
@@ -1,12 +1,13 @@
|
|||||||
#serial 1
|
#serial 4
|
||||||
|
|
||||||
dnl FIXME: put these prerequisite-only *.m4 files in a separate
|
dnl FIXME: put these prerequisite-only *.m4 files in a separate
|
||||||
dnl directory -- otherwise, they'll conflict with existing files.
|
dnl directory -- otherwise, they'll conflict with existing files.
|
||||||
|
|
||||||
dnl These are the prerequisite macros for GNU's error.c file.
|
dnl These are the prerequisite macros for GNU's error.c file.
|
||||||
AC_DEFUN(jm_PREREQ_ERROR,
|
AC_DEFUN([jm_PREREQ_ERROR],
|
||||||
[
|
[
|
||||||
AC_CHECK_FUNCS(strerror strerror_r vprintf doprnt)
|
AC_CHECK_FUNCS(strerror vprintf doprnt)
|
||||||
AC_HEADER_STDC
|
AC_CHECK_DECLS([strerror])
|
||||||
AC_FUNC_STRERROR_R
|
AC_FUNC_STRERROR_R
|
||||||
|
AC_HEADER_STDC
|
||||||
])
|
])
|
||||||
|
|||||||
+7
-5
@@ -3,10 +3,12 @@
|
|||||||
#
|
#
|
||||||
# This file can be copied and used freely without restrictions. It can
|
# This file can be copied and used freely without restrictions. It can
|
||||||
# be used in projects which are not available under the GNU General Public
|
# be used in projects which are not available under the GNU General Public
|
||||||
# License but which still want to provide support for the GNU gettext
|
# License or the GNU Library General Public License but which still want
|
||||||
# functionality.
|
# to provide support for the GNU gettext functionality.
|
||||||
# Please note that the actual code of GNU gettext is covered by the GNU
|
# Please note that the actual code of the GNU gettext library is covered
|
||||||
# General Public License and is *not* in the public domain.
|
# by the GNU Library General Public License, and the rest of the GNU
|
||||||
|
# gettext package package is covered by the GNU General Public License.
|
||||||
|
# They are *not* in the public domain.
|
||||||
|
|
||||||
# serial 10
|
# serial 10
|
||||||
|
|
||||||
@@ -241,7 +243,7 @@ return (int) gettext ("")]ifelse([$2], need-ngettext, [ + (int) ngettext ("", ""
|
|||||||
dnl Found it, now check the version.
|
dnl Found it, now check the version.
|
||||||
AC_MSG_CHECKING([version of bison])
|
AC_MSG_CHECKING([version of bison])
|
||||||
changequote(<<,>>)dnl
|
changequote(<<,>>)dnl
|
||||||
ac_prog_version=`$INTLBISON --version 2>&1 | sed -n 's/^.*GNU Bison .* \([0-9]*\.[0-9.]*\).*$/\1/p'`
|
ac_prog_version=`$INTLBISON --version 2>&1 | sed -n 's/^.*GNU Bison.* \([0-9]*\.[0-9.]*\).*$/\1/p'`
|
||||||
case $ac_prog_version in
|
case $ac_prog_version in
|
||||||
'') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
|
'') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
|
||||||
1.2[6-9]* | 1.[3-9][0-9]* | [2-9].*)
|
1.2[6-9]* | 1.[3-9][0-9]* | [2-9].*)
|
||||||
|
|||||||
+6
-4
@@ -3,10 +3,12 @@
|
|||||||
#
|
#
|
||||||
# This file can be copied and used freely without restrictions. It can
|
# This file can be copied and used freely without restrictions. It can
|
||||||
# be used in projects which are not available under the GNU General Public
|
# be used in projects which are not available under the GNU General Public
|
||||||
# License but which still want to provide support for the GNU gettext
|
# License or the GNU Library General Public License but which still want
|
||||||
# functionality.
|
# to provide support for the GNU gettext functionality.
|
||||||
# Please note that the actual code of GNU gettext is covered by the GNU
|
# Please note that the actual code of the GNU gettext library is covered
|
||||||
# General Public License and is *not* in the public domain.
|
# by the GNU Library General Public License, and the rest of the GNU
|
||||||
|
# gettext package package is covered by the GNU General Public License.
|
||||||
|
# They are *not* in the public domain.
|
||||||
|
|
||||||
# serial 2
|
# serial 2
|
||||||
|
|
||||||
|
|||||||
+6
-7
@@ -1,16 +1,16 @@
|
|||||||
#serial 3
|
#serial 5
|
||||||
|
|
||||||
dnl From Jim Meyering.
|
dnl From Jim Meyering.
|
||||||
dnl Determine whether malloc accepts 0 as its argument.
|
dnl Determine whether malloc accepts 0 as its argument.
|
||||||
dnl If it doesn't, arrange to use the replacement function.
|
dnl If it doesn't, arrange to use the replacement function.
|
||||||
dnl
|
dnl
|
||||||
|
|
||||||
AC_DEFUN(jm_FUNC_MALLOC,
|
AC_DEFUN([jm_FUNC_MALLOC],
|
||||||
[
|
[
|
||||||
dnl xmalloc.c requires that this symbol be defined so it doesn't
|
dnl xmalloc.c requires that this symbol be defined so it doesn't
|
||||||
dnl mistakenly use a broken malloc -- as it might if this test were omitted.
|
dnl mistakenly use a broken malloc -- as it might if this test were omitted.
|
||||||
AC_DEFINE_UNQUOTED(HAVE_DONE_WORKING_MALLOC_CHECK, 1,
|
AC_DEFINE(HAVE_DONE_WORKING_MALLOC_CHECK, 1,
|
||||||
[Define if the malloc check has been performed. ])
|
[Define if the malloc check has been performed. ])
|
||||||
|
|
||||||
AC_CACHE_CHECK([for working malloc], jm_cv_func_working_malloc,
|
AC_CACHE_CHECK([for working malloc], jm_cv_func_working_malloc,
|
||||||
[AC_TRY_RUN([
|
[AC_TRY_RUN([
|
||||||
@@ -27,9 +27,8 @@ AC_DEFUN(jm_FUNC_MALLOC,
|
|||||||
jm_cv_func_working_malloc=no)
|
jm_cv_func_working_malloc=no)
|
||||||
])
|
])
|
||||||
if test $jm_cv_func_working_malloc = no; then
|
if test $jm_cv_func_working_malloc = no; then
|
||||||
AC_SUBST(LIBOBJS)
|
AC_LIBOBJ(malloc)
|
||||||
LIBOBJS="$LIBOBJS malloc.$ac_objext"
|
AC_DEFINE(malloc, rpl_malloc,
|
||||||
AC_DEFINE_UNQUOTED(malloc, rpl_malloc,
|
|
||||||
[Define to rpl_malloc if the replacement function should be used.])
|
[Define to rpl_malloc if the replacement function should be used.])
|
||||||
fi
|
fi
|
||||||
])
|
])
|
||||||
|
|||||||
+2
-2
@@ -1,4 +1,4 @@
|
|||||||
# serial 8
|
# serial 9
|
||||||
|
|
||||||
# From Paul Eggert.
|
# From Paul Eggert.
|
||||||
|
|
||||||
@@ -10,7 +10,7 @@
|
|||||||
# (at least glibc-2.1.3) because the "_XOPEN_SOURCE 500" definition elicits
|
# (at least glibc-2.1.3) because the "_XOPEN_SOURCE 500" definition elicits
|
||||||
# a syntax error in wchar.h due to the use of undefined __int32_t.
|
# a syntax error in wchar.h due to the use of undefined __int32_t.
|
||||||
|
|
||||||
AC_DEFUN(AC_MBSTATE_T,
|
AC_DEFUN([AC_MBSTATE_T],
|
||||||
[
|
[
|
||||||
AC_CHECK_HEADERS(stdlib.h)
|
AC_CHECK_HEADERS(stdlib.h)
|
||||||
|
|
||||||
|
|||||||
+6
-4
@@ -3,10 +3,12 @@
|
|||||||
#
|
#
|
||||||
# This file can be copied and used freely without restrictions. It can
|
# This file can be copied and used freely without restrictions. It can
|
||||||
# be used in projects which are not available under the GNU General Public
|
# be used in projects which are not available under the GNU General Public
|
||||||
# License but which still want to provide support for the GNU gettext
|
# License or the GNU Library General Public License but which still want
|
||||||
# functionality.
|
# to provide support for the GNU gettext functionality.
|
||||||
# Please note that the actual code of GNU gettext is covered by the GNU
|
# Please note that the actual code of the GNU gettext library is covered
|
||||||
# General Public License and is *not* in the public domain.
|
# by the GNU Library General Public License, and the rest of the GNU
|
||||||
|
# gettext package package is covered by the GNU General Public License.
|
||||||
|
# They are *not* in the public domain.
|
||||||
|
|
||||||
# serial 2
|
# serial 2
|
||||||
|
|
||||||
|
|||||||
+6
-7
@@ -1,16 +1,16 @@
|
|||||||
#serial 3
|
#serial 5
|
||||||
|
|
||||||
dnl From Jim Meyering.
|
dnl From Jim Meyering.
|
||||||
dnl Determine whether realloc works when both arguments are 0.
|
dnl Determine whether realloc works when both arguments are 0.
|
||||||
dnl If it doesn't, arrange to use the replacement function.
|
dnl If it doesn't, arrange to use the replacement function.
|
||||||
dnl
|
dnl
|
||||||
|
|
||||||
AC_DEFUN(jm_FUNC_REALLOC,
|
AC_DEFUN([jm_FUNC_REALLOC],
|
||||||
[
|
[
|
||||||
dnl xmalloc.c requires that this symbol be defined so it doesn't
|
dnl xmalloc.c requires that this symbol be defined so it doesn't
|
||||||
dnl mistakenly use a broken realloc -- as it might if this test were omitted.
|
dnl mistakenly use a broken realloc -- as it might if this test were omitted.
|
||||||
AC_DEFINE_UNQUOTED(HAVE_DONE_WORKING_REALLOC_CHECK, 1,
|
AC_DEFINE(HAVE_DONE_WORKING_REALLOC_CHECK, 1,
|
||||||
[Define if the realloc check has been performed. ])
|
[Define if the realloc check has been performed. ])
|
||||||
|
|
||||||
AC_CACHE_CHECK([for working realloc], jm_cv_func_working_realloc,
|
AC_CACHE_CHECK([for working realloc], jm_cv_func_working_realloc,
|
||||||
[AC_TRY_RUN([
|
[AC_TRY_RUN([
|
||||||
@@ -27,9 +27,8 @@ AC_DEFUN(jm_FUNC_REALLOC,
|
|||||||
jm_cv_func_working_realloc=no)
|
jm_cv_func_working_realloc=no)
|
||||||
])
|
])
|
||||||
if test $jm_cv_func_working_realloc = no; then
|
if test $jm_cv_func_working_realloc = no; then
|
||||||
AC_SUBST(LIBOBJS)
|
AC_LIBOBJ(realloc)
|
||||||
LIBOBJS="$LIBOBJS realloc.$ac_objext"
|
AC_DEFINE(realloc, rpl_realloc,
|
||||||
AC_DEFINE_UNQUOTED(realloc, rpl_realloc,
|
|
||||||
[Define to rpl_realloc if the replacement function should be used.])
|
[Define to rpl_realloc if the replacement function should be used.])
|
||||||
fi
|
fi
|
||||||
])
|
])
|
||||||
|
|||||||
+38
-45
@@ -1,9 +1,23 @@
|
|||||||
#serial 1002
|
#serial 1003
|
||||||
# Experimental replacement for the function in the latest CVS autoconf.
|
# Experimental replacement for the function in the latest CVS autoconf.
|
||||||
# If the compile-test says strerror_r doesn't work, then resort to a
|
|
||||||
# `run'-test that works on BeOS and segfaults on DEC Unix.
|
|
||||||
# Use with the error.c file in ../lib.
|
# Use with the error.c file in ../lib.
|
||||||
|
|
||||||
|
# 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. */
|
||||||
|
|
||||||
undefine([AC_FUNC_STRERROR_R])
|
undefine([AC_FUNC_STRERROR_R])
|
||||||
|
|
||||||
# AC_FUNC_STRERROR_R
|
# AC_FUNC_STRERROR_R
|
||||||
@@ -11,56 +25,35 @@ undefine([AC_FUNC_STRERROR_R])
|
|||||||
AC_DEFUN([AC_FUNC_STRERROR_R],
|
AC_DEFUN([AC_FUNC_STRERROR_R],
|
||||||
[AC_CHECK_DECLS([strerror_r])
|
[AC_CHECK_DECLS([strerror_r])
|
||||||
AC_CHECK_FUNCS([strerror_r])
|
AC_CHECK_FUNCS([strerror_r])
|
||||||
if test $ac_cv_func_strerror_r = yes; then
|
AC_CACHE_CHECK([whether strerror_r returns char *],
|
||||||
AC_CHECK_HEADERS(string.h)
|
ac_cv_func_strerror_r_char_p,
|
||||||
AC_CACHE_CHECK([for working strerror_r],
|
|
||||||
ac_cv_func_strerror_r_works,
|
|
||||||
[
|
[
|
||||||
AC_TRY_COMPILE(
|
ac_cv_func_strerror_r_char_p=no
|
||||||
[
|
if test $ac_cv_have_decl_strerror_r = yes; then
|
||||||
# include <stdio.h>
|
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT],
|
||||||
# if HAVE_STRING_H
|
[[
|
||||||
# include <string.h>
|
char buf[100];
|
||||||
# endif
|
char x = *strerror_r (0, buf, sizeof buf);
|
||||||
],
|
char *p = strerror_r (0, buf, sizeof buf);
|
||||||
[
|
]])],
|
||||||
char buf[100];
|
ac_cv_func_strerror_r_char_p=yes)
|
||||||
char x = *strerror_r (0, buf, sizeof buf);
|
else
|
||||||
],
|
# strerror_r is not declared. Choose between
|
||||||
ac_cv_func_strerror_r_works=yes,
|
|
||||||
ac_cv_func_strerror_r_works=no
|
|
||||||
)
|
|
||||||
if test $ac_cv_func_strerror_r_works = no; then
|
|
||||||
# strerror_r seems not to work, but now we have to choose between
|
|
||||||
# systems that have relatively inaccessible declarations for the
|
# systems that have relatively inaccessible declarations for the
|
||||||
# function. BeOS and DEC UNIX 4.0 fall in this category, but the
|
# function. BeOS and DEC UNIX 4.0 fall in this category, but the
|
||||||
# former has a strerror_r that returns char*, while the latter
|
# former has a strerror_r that returns char*, while the latter
|
||||||
# has a strerror_r that returns `int'.
|
# has a strerror_r that returns `int'.
|
||||||
# This test should segfault on the DEC system.
|
# This test should segfault on the DEC system.
|
||||||
AC_TRY_RUN(
|
AC_RUN_IFELSE([AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT
|
||||||
[
|
extern char *strerror_r ();],
|
||||||
# include <stdio.h>
|
[[char buf[100];
|
||||||
# include <string.h>
|
|
||||||
# include <ctype.h>
|
|
||||||
|
|
||||||
extern char *strerror_r ();
|
|
||||||
|
|
||||||
int
|
|
||||||
main ()
|
|
||||||
{
|
|
||||||
char buf[100];
|
|
||||||
char x = *strerror_r (0, buf, sizeof buf);
|
char x = *strerror_r (0, buf, sizeof buf);
|
||||||
exit (!isalpha (x));
|
exit (!isalpha (x));]])],
|
||||||
}
|
ac_cv_func_strerror_r_char_p=yes, , :)
|
||||||
],
|
|
||||||
ac_cv_func_strerror_r_works=yes,
|
|
||||||
ac_cv_func_strerror_r_works=no,
|
|
||||||
ac_cv_func_strerror_r_works=no)
|
|
||||||
fi
|
fi
|
||||||
])
|
])
|
||||||
if test $ac_cv_func_strerror_r_works = yes; then
|
if test $ac_cv_func_strerror_r_char_p = yes; then
|
||||||
AC_DEFINE_UNQUOTED(HAVE_WORKING_STRERROR_R, 1,
|
AC_DEFINE([STRERROR_R_CHAR_P], 1,
|
||||||
[Define to 1 if `strerror_r' returns a string.])
|
[Define to 1 if strerror_r returns char *.])
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
])# AC_FUNC_STRERROR_R
|
])# AC_FUNC_STRERROR_R
|
||||||
|
|||||||
+1
-2
@@ -1,6 +1,5 @@
|
|||||||
ChangeLog
|
ChangeLog
|
||||||
Makefile
|
Makefile Makefile.in
|
||||||
Makefile.in
|
|
||||||
POTFILES
|
POTFILES
|
||||||
bison.pot
|
bison.pot
|
||||||
stamp-cat-id
|
stamp-cat-id
|
||||||
|
|||||||
@@ -1,16 +1,3 @@
|
|||||||
2001-10-10 gettextize <[email protected]>
|
|
||||||
|
|
||||||
* Makefile.in.in: Upgrade to gettext-0.10.40.
|
|
||||||
|
|
||||||
2001-10-10 gettextize <[email protected]>
|
|
||||||
|
|
||||||
* Makefile.in.in: Upgrade to gettext-0.10.40.
|
|
||||||
|
|
||||||
2001-10-09 gettextize <[email protected]>
|
|
||||||
|
|
||||||
* Makefile.in.in: Upgrade to gettext-0.10.40.
|
|
||||||
* cat-id-tbl.c: Remove file.
|
|
||||||
|
|
||||||
2001-09-27 gettextize <[email protected]>
|
2001-09-27 gettextize <[email protected]>
|
||||||
|
|
||||||
* Makefile.in.in: Upgrade to gettext-0.10.40.
|
* Makefile.in.in: Upgrade to gettext-0.10.40.
|
||||||
|
|||||||
@@ -1,13 +1,10 @@
|
|||||||
src/LR0.c
|
src/LR0.c
|
||||||
src/complain.c
|
src/complain.c
|
||||||
src/conflicts.c
|
src/conflicts.c
|
||||||
src/derives.c
|
|
||||||
src/files.c
|
src/files.c
|
||||||
src/getargs.c
|
src/getargs.c
|
||||||
src/lalr.c
|
src/lalr.c
|
||||||
src/lex.c
|
src/lex.c
|
||||||
src/main.c
|
|
||||||
src/nullable.c
|
|
||||||
src/output.c
|
src/output.c
|
||||||
src/print.c
|
src/print.c
|
||||||
src/print_graph.c
|
src/print_graph.c
|
||||||
|
|||||||
@@ -4,21 +4,21 @@
|
|||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: bison 1.28d\n"
|
"Project-Id-Version: bison 1.30e\n"
|
||||||
"POT-Creation-Date: 2001-10-02 18:30+0200\n"
|
"POT-Creation-Date: 2001-12-05 12:47+0100\n"
|
||||||
"PO-Revision-Date: 2001-08-29 17:06+02:00\n"
|
"PO-Revision-Date: 2001-11-26 22:45+0200\n"
|
||||||
"Last-Translator: Toomas Soome <[email protected]>\n"
|
"Last-Translator: Toomas Soome <[email protected]>\n"
|
||||||
"Language-Team: Estonian <[email protected]>\n"
|
"Language-Team: Estonian <[email protected]>\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
||||||
"Content-Transfer-Encoding: 8-bit\n"
|
"Content-Transfer-Encoding: 8-bit\n"
|
||||||
|
|
||||||
#: src/LR0.c:207
|
#: src/LR0.c:189
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "too many states (max %d)"
|
msgid "too many states (max %d)"
|
||||||
msgstr "liiga palju olekuid (maks %d)"
|
msgstr "liiga palju olekuid (maks %d)"
|
||||||
|
|
||||||
#: lib/error.c:117 src/complain.c:96
|
#: lib/error.c:128 lib/error.c:156 src/complain.c:96
|
||||||
msgid "Unknown system error"
|
msgid "Unknown system error"
|
||||||
msgstr "Tundmatu süsteemi viga"
|
msgstr "Tundmatu süsteemi viga"
|
||||||
|
|
||||||
@@ -26,81 +26,84 @@ msgstr "Tundmatu s
|
|||||||
msgid "warning: "
|
msgid "warning: "
|
||||||
msgstr "hoiatus: "
|
msgstr "hoiatus: "
|
||||||
|
|
||||||
#: src/complain.c:238 src/complain.c:279
|
#: src/complain.c:238
|
||||||
msgid "fatal error: "
|
msgid "fatal error: "
|
||||||
msgstr "fataalne viga: "
|
msgstr "fataalne viga: "
|
||||||
|
|
||||||
#: src/conflicts.c:48
|
#: src/conflicts.c:44
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Conflict in state %d between rule %d and token %s resolved as %s.\n"
|
msgid "Conflict in state %d between rule %d and token %s resolved as %s.\n"
|
||||||
msgstr "Konflikt olekus %d reegli %d ja märgi %s vahel lahendatud, kui %s.\n"
|
msgstr "Konflikt olekus %d reegli %d ja märgi %s vahel lahendatud, kui %s.\n"
|
||||||
|
|
||||||
#: src/conflicts.c:114 src/conflicts.c:137
|
#: src/conflicts.c:94 src/conflicts.c:119
|
||||||
msgid "reduce"
|
msgid "reduce"
|
||||||
msgstr "redutseerimine"
|
msgstr "redutseerimine"
|
||||||
|
|
||||||
#: src/conflicts.c:120 src/conflicts.c:133
|
#: src/conflicts.c:101 src/conflicts.c:115
|
||||||
msgid "shift"
|
msgid "shift"
|
||||||
msgstr "nihutamine"
|
msgstr "nihutamine"
|
||||||
|
|
||||||
#: src/conflicts.c:141
|
#: src/conflicts.c:123
|
||||||
msgid "an error"
|
msgid "an error"
|
||||||
msgstr "viga"
|
msgstr "viga"
|
||||||
|
|
||||||
#: src/conflicts.c:421
|
#: src/conflicts.c:302
|
||||||
msgid " 1 shift/reduce conflict"
|
|
||||||
msgstr " 1 nihutamine/redutseerimine konflikt"
|
|
||||||
|
|
||||||
#: src/conflicts.c:426
|
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid " %d shift/reduce conflicts"
|
msgid "%d shift/reduce conflict"
|
||||||
msgstr " %d nihutamine/redutseerimine konflikti"
|
msgid_plural "%d shift/reduce conflicts"
|
||||||
|
msgstr[0] "%d nihutamine/redutseerimine konflikt"
|
||||||
|
msgstr[1] "%d nihutamine/redutseerimine konflikti"
|
||||||
|
|
||||||
#: src/conflicts.c:432
|
#: src/conflicts.c:309
|
||||||
msgid " and"
|
msgid "and"
|
||||||
msgstr " ja"
|
msgstr "ja"
|
||||||
|
|
||||||
#: src/conflicts.c:438
|
#: src/conflicts.c:315
|
||||||
msgid " 1 reduce/reduce conflict"
|
|
||||||
msgstr " 1 redutseerimine/redutseerimine konflikt"
|
|
||||||
|
|
||||||
#: src/conflicts.c:443
|
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid " %d reduce/reduce conflicts"
|
msgid "%d reduce/reduce conflict"
|
||||||
msgstr " %d redutseerimine/redutseerimine konflikti"
|
msgid_plural "%d reduce/reduce conflicts"
|
||||||
|
msgstr[0] "%d redutseerimine/redutseerimine konflikt"
|
||||||
|
msgstr[1] "%d redutseerimine/redutseerimine konflikti"
|
||||||
|
|
||||||
#: src/conflicts.c:480
|
#: src/conflicts.c:340
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "State %d contains"
|
msgid "State %d contains "
|
||||||
msgstr "Olek %d sisaldab"
|
msgstr "Olek %d sisaldab "
|
||||||
|
|
||||||
#. If invoked with `--yacc', use the output format specified by
|
#. If invoked with `--yacc', use the output format specified by
|
||||||
#. POSIX.
|
#. POSIX.
|
||||||
#: src/conflicts.c:491
|
#: src/conflicts.c:387
|
||||||
msgid "conflicts: "
|
msgid "conflicts: "
|
||||||
msgstr "konfliktid: "
|
msgstr "konfliktid: "
|
||||||
|
|
||||||
#: src/conflicts.c:493
|
#: src/conflicts.c:389
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid " %d shift/reduce"
|
msgid " %d shift/reduce"
|
||||||
msgstr " %d nihutamine/redutseerimine"
|
msgstr " %d nihutamine/redutseerimine"
|
||||||
|
|
||||||
#: src/conflicts.c:497
|
#: src/conflicts.c:393
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid " %d reduce/reduce"
|
msgid " %d reduce/reduce"
|
||||||
msgstr " %d redutseerimine/redutseerimine"
|
msgstr " %d redutseerimine/redutseerimine"
|
||||||
|
|
||||||
#: src/conflicts.c:502
|
#: src/conflicts.c:398 src/reduce.c:508
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s contains"
|
msgid "%s contains "
|
||||||
msgstr "%s sisaldab"
|
msgstr "%s sisaldab "
|
||||||
|
|
||||||
#: src/conflicts.c:588 src/conflicts.c:709
|
#: src/conflicts.c:405
|
||||||
|
#, c-format
|
||||||
|
msgid "expected %d shift/reduce conflict\n"
|
||||||
|
msgid_plural "expected %d shift/reduce conflicts\n"
|
||||||
|
msgstr[0] "eeldasime %d nihutamine/redutseerimine konflikti\n"
|
||||||
|
msgstr[1] "eeldasime %d nihutamine/redutseerimine konflikti\n"
|
||||||
|
|
||||||
|
#: src/conflicts.c:457 src/conflicts.c:534
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid " %-4s\t[reduce using rule %d (%s)]\n"
|
msgid " %-4s\t[reduce using rule %d (%s)]\n"
|
||||||
msgstr " %-4s\t[redutseerin, kasutades reeglit %d (%s)]\n"
|
msgstr " %-4s\t[redutseerin, kasutades reeglit %d (%s)]\n"
|
||||||
|
|
||||||
#: src/conflicts.c:600 src/print.c:171
|
#: src/conflicts.c:461 src/print.c:154
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
" $default\treduce using rule %d (%s)\n"
|
" $default\treduce using rule %d (%s)\n"
|
||||||
@@ -109,46 +112,37 @@ msgstr ""
|
|||||||
" $default\tredutseerin kasutades reeglit %d (%s)\n"
|
" $default\tredutseerin kasutades reeglit %d (%s)\n"
|
||||||
"\n"
|
"\n"
|
||||||
|
|
||||||
#: src/conflicts.c:689 src/conflicts.c:703
|
#: src/conflicts.c:515 src/conflicts.c:528
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid " %-4s\treduce using rule %d (%s)\n"
|
msgid " %-4s\treduce using rule %d (%s)\n"
|
||||||
msgstr " %-4s\tredutseerin kasutades reeglit %d (%s)\n"
|
msgstr " %-4s\tredutseerin kasutades reeglit %d (%s)\n"
|
||||||
|
|
||||||
#: src/conflicts.c:730
|
#: src/conflicts.c:544
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid " $default\treduce using rule %d (%s)\n"
|
msgid " $default\treduce using rule %d (%s)\n"
|
||||||
msgstr " $default\tredutseerin kasutades reeglit %d (%s)\n"
|
msgstr " $default\tredutseerin kasutades reeglit %d (%s)\n"
|
||||||
|
|
||||||
#: src/derives.c:43
|
#: src/files.c:144
|
||||||
msgid "DERIVES"
|
|
||||||
msgstr "DERIVES"
|
|
||||||
|
|
||||||
#: src/derives.c:48
|
|
||||||
#, c-format
|
|
||||||
msgid "%s derives"
|
|
||||||
msgstr "%s derives"
|
|
||||||
|
|
||||||
#: src/files.c:133
|
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "cannot open file `%s'"
|
msgid "cannot open file `%s'"
|
||||||
msgstr "faili `%s' ei saa avada"
|
msgstr "faili `%s' ei saa avada"
|
||||||
|
|
||||||
#: src/files.c:152
|
#: src/files.c:163
|
||||||
msgid "cannot close file"
|
msgid "cannot close file"
|
||||||
msgstr "faili ei õnnestu sulgeda"
|
msgstr "faili ei õnnestu sulgeda"
|
||||||
|
|
||||||
#. Some efforts were made to ease the translators' task, please
|
#. Some efforts were made to ease the translators' task, please
|
||||||
#. continue.
|
#. continue.
|
||||||
#: src/getargs.c:83
|
#: src/getargs.c:84
|
||||||
msgid "GNU bison generates parsers for LALR(1) grammars.\n"
|
msgid "GNU bison generates parsers for LALR(1) grammars.\n"
|
||||||
msgstr "GNU bison genereerib parsereid LALR(1) grammatikatele.\n"
|
msgstr "GNU bison genereerib parsereid LALR(1) grammatikatele.\n"
|
||||||
|
|
||||||
#: src/getargs.c:87
|
#: src/getargs.c:88
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Usage: %s [OPTION]... FILE\n"
|
msgid "Usage: %s [OPTION]... FILE\n"
|
||||||
msgstr "Kasuta: %s [VÕTI]...FAIL\n"
|
msgstr "Kasuta: %s [VÕTI]...FAIL\n"
|
||||||
|
|
||||||
#: src/getargs.c:91
|
#: src/getargs.c:92
|
||||||
msgid ""
|
msgid ""
|
||||||
"If a long option shows an argument as mandatory, then it is mandatory\n"
|
"If a long option shows an argument as mandatory, then it is mandatory\n"
|
||||||
"for the equivalent short option also. Similarly for optional arguments.\n"
|
"for the equivalent short option also. Similarly for optional arguments.\n"
|
||||||
@@ -156,7 +150,7 @@ msgstr ""
|
|||||||
"Kui pikk võti näitab, et argument on kohustuslik, siis on see kohustuslik \n"
|
"Kui pikk võti näitab, et argument on kohustuslik, siis on see kohustuslik \n"
|
||||||
"ka lühikese võtme korral. Sama ka vabalt valitavate võtmete korral.\n"
|
"ka lühikese võtme korral. Sama ka vabalt valitavate võtmete korral.\n"
|
||||||
|
|
||||||
#: src/getargs.c:97
|
#: src/getargs.c:98
|
||||||
msgid ""
|
msgid ""
|
||||||
"Operation modes:\n"
|
"Operation modes:\n"
|
||||||
" -h, --help display this help and exit\n"
|
" -h, --help display this help and exit\n"
|
||||||
@@ -168,7 +162,7 @@ msgstr ""
|
|||||||
" -V, --version esita versiooniinfo ja lõpeta töö\n"
|
" -V, --version esita versiooniinfo ja lõpeta töö\n"
|
||||||
" -y, --yacc emuleeri POSIX yacc\n"
|
" -y, --yacc emuleeri POSIX yacc\n"
|
||||||
|
|
||||||
#: src/getargs.c:104
|
#: src/getargs.c:105
|
||||||
msgid ""
|
msgid ""
|
||||||
"Parser:\n"
|
"Parser:\n"
|
||||||
" -S, --skeleton=FILE specify the skeleton to use\n"
|
" -S, --skeleton=FILE specify the skeleton to use\n"
|
||||||
@@ -188,14 +182,14 @@ msgstr ""
|
|||||||
" -n, --no-parser genereeri ainult tabelid\n"
|
" -n, --no-parser genereeri ainult tabelid\n"
|
||||||
" -k, --token-table lisa ka sümbolite nimede tabel\n"
|
" -k, --token-table lisa ka sümbolite nimede tabel\n"
|
||||||
|
|
||||||
#: src/getargs.c:116
|
#: src/getargs.c:117
|
||||||
msgid ""
|
msgid ""
|
||||||
"Output:\n"
|
"Output:\n"
|
||||||
" -d, --defines also produce a header file\n"
|
" -d, --defines also produce a header file\n"
|
||||||
" -v, --verbose also produce an explanation of the automaton\n"
|
" -v, --verbose also produce an explanation of the automaton\n"
|
||||||
" -b, --file-prefix=PREFIX specify a PREFIX for output files\n"
|
" -b, --file-prefix=PREFIX specify a PREFIX for output files\n"
|
||||||
" -o, --output-file=FILE leave output to FILE\n"
|
" -o, --output=FILE leave output to FILE\n"
|
||||||
" -g, --graph also produce a VCG graph description of the "
|
" -g, --graph also produce a VCG description of the "
|
||||||
"automaton\n"
|
"automaton\n"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Väljund:\n"
|
"Väljund:\n"
|
||||||
@@ -205,25 +199,25 @@ msgstr ""
|
|||||||
" -o, --output-file=FAIL jäta väljund FAILi\n"
|
" -o, --output-file=FAIL jäta väljund FAILi\n"
|
||||||
" -g, --graph loo automaadi kirjeldus VCG graafina\n"
|
" -g, --graph loo automaadi kirjeldus VCG graafina\n"
|
||||||
|
|
||||||
#: src/getargs.c:126
|
#: src/getargs.c:127
|
||||||
msgid "Report bugs to <[email protected]>.\n"
|
msgid "Report bugs to <[email protected]>.\n"
|
||||||
msgstr "Teatage palun vigadest aadressil <[email protected]>.\n"
|
msgstr "Teatage palun vigadest aadressil <[email protected]>.\n"
|
||||||
|
|
||||||
#. Some efforts were made to ease the translators' task, please
|
#. Some efforts were made to ease the translators' task, please
|
||||||
#. continue.
|
#. continue.
|
||||||
#: src/getargs.c:140
|
#: src/getargs.c:141
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "bison (GNU Bison) %s"
|
msgid "bison (GNU Bison) %s"
|
||||||
msgstr "bison (GNU Bison) %s"
|
msgstr "bison (GNU Bison) %s"
|
||||||
|
|
||||||
#: src/getargs.c:145
|
#: src/getargs.c:146
|
||||||
msgid ""
|
msgid ""
|
||||||
"Copyright 1984, 1986, 1989, 1992, 2000, 2001 Free Software Foundation, Inc.\n"
|
"Copyright 1984, 1986, 1989, 1992, 2000, 2001 Free Software Foundation, Inc.\n"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Autoriõigus 1984, 1986, 1989, 1992, 2000, 2001 Free Software Foundation, "
|
"Autoriõigus 1984, 1986, 1989, 1992, 2000, 2001 Free Software Foundation, "
|
||||||
"Inc.\n"
|
"Inc.\n"
|
||||||
|
|
||||||
#: src/getargs.c:149
|
#: src/getargs.c:150
|
||||||
msgid ""
|
msgid ""
|
||||||
"This is free software; see the source for copying conditions. There is NO\n"
|
"This is free software; see the source for copying conditions. There is NO\n"
|
||||||
"warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
|
"warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
|
||||||
@@ -231,541 +225,511 @@ msgstr ""
|
|||||||
"See on vaba tarkvara; kopeerimistingimused leiate lähtetekstidest. Garantii\n"
|
"See on vaba tarkvara; kopeerimistingimused leiate lähtetekstidest. Garantii\n"
|
||||||
"PUUDUB; ka müügiks või mingil eesmärgil kasutamiseks.\n"
|
"PUUDUB; ka müügiks või mingil eesmärgil kasutamiseks.\n"
|
||||||
|
|
||||||
#: src/getargs.c:214 src/lex.c:650
|
#: src/getargs.c:215 src/lex.c:694
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "`%s' is no longer supported"
|
msgid "`%s' is no longer supported"
|
||||||
msgstr "`%s' ei ole enam toetatud"
|
msgstr "`%s' ei ole enam toetatud"
|
||||||
|
|
||||||
#: src/getargs.c:238
|
#: src/getargs.c:239
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Try `%s --help' for more information.\n"
|
msgid "Try `%s --help' for more information.\n"
|
||||||
msgstr "Lisainfo saamiseks proovige `%s --help'.\n"
|
msgstr "Lisainfo saamiseks proovige `%s --help'.\n"
|
||||||
|
|
||||||
#: src/getargs.c:245
|
#: src/getargs.c:246
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s: no grammar file given\n"
|
msgid "%s: no grammar file given\n"
|
||||||
msgstr "%s: puudub grammatikafail\n"
|
msgstr "%s: puudub grammatikafail\n"
|
||||||
|
|
||||||
#: src/getargs.c:249
|
#: src/getargs.c:250
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s: extra arguments ignored after `%s'\n"
|
msgid "%s: extra arguments ignored after `%s'\n"
|
||||||
msgstr "%s: ignoreerin lisaargumente peale `%s'\n"
|
msgstr "%s: ignoreerin lisaargumente peale `%s'\n"
|
||||||
|
|
||||||
#: src/lalr.c:311
|
#: src/lalr.c:255
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "too many gotos (max %d)"
|
msgid "too many gotos (max %d)"
|
||||||
msgstr "liiga palju gotosid (maks %d)"
|
msgstr "liiga palju gotosid (maks %d)"
|
||||||
|
|
||||||
#: src/lex.c:78
|
#: src/lex.c:76
|
||||||
msgid "unexpected `/' found and ignored"
|
msgid "unexpected `/' found and ignored"
|
||||||
msgstr "leidsin ja ignoreerin ootamatu `/'"
|
msgstr "leidsin ja ignoreerin ootamatu `/'"
|
||||||
|
|
||||||
#: src/lex.c:107 src/reader.c:269
|
#: src/lex.c:105 src/reader.c:280
|
||||||
msgid "unterminated comment"
|
msgid "unterminated comment"
|
||||||
msgstr "lõpetamata kommentaar"
|
msgstr "lõpetamata kommentaar"
|
||||||
|
|
||||||
#: src/lex.c:139
|
#: src/lex.c:137
|
||||||
msgid "unexpected end of file"
|
msgid "unexpected end of file"
|
||||||
msgstr "ootamatu faililõpp"
|
msgstr "ootamatu faililõpp"
|
||||||
|
|
||||||
#: src/lex.c:168
|
#: src/lex.c:166
|
||||||
msgid "unescaped newline in constant"
|
msgid "unescaped newline in constant"
|
||||||
msgstr "paojadata reavahetus konstandis"
|
msgstr "paojadata reavahetus konstandis"
|
||||||
|
|
||||||
#: src/lex.c:210
|
#: src/lex.c:208
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "octal value outside range 0...255: `\\%o'"
|
msgid "octal value outside range 0...255: `\\%o'"
|
||||||
msgstr "kaheksandväärtus väljaspool piire 0...255: `\\%o'"
|
msgstr "kaheksandväärtus väljaspool piire 0...255: `\\%o'"
|
||||||
|
|
||||||
#: src/lex.c:235
|
#: src/lex.c:233
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "hexadecimal value above 255: `\\x%x'"
|
msgid "hexadecimal value above 255: `\\x%x'"
|
||||||
msgstr "kuueteistkümnendväärtus suurem, kui above 255: `\\x%x'"
|
msgstr "kuueteistkümnendväärtus suurem, kui above 255: `\\x%x'"
|
||||||
|
|
||||||
#: src/lex.c:247
|
#: src/lex.c:245
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "unknown escape sequence: `\\' followed by `%s'"
|
msgid "unknown escape sequence: `\\' followed by `%s'"
|
||||||
msgstr "tundmatu paojada: `\\' järgneb `%s'"
|
msgstr "tundmatu paojada: `\\' järgneb `%s'"
|
||||||
|
|
||||||
#: src/lex.c:343
|
#: src/lex.c:342
|
||||||
msgid "unterminated type name at end of file"
|
msgid "unterminated type name at end of file"
|
||||||
msgstr "lõpetamata tüübinimi faili lõpus"
|
msgstr "lõpetamata tüübinimi faili lõpus"
|
||||||
|
|
||||||
#: src/lex.c:346
|
#: src/lex.c:345
|
||||||
msgid "unterminated type name"
|
msgid "unterminated type name"
|
||||||
msgstr "lõpetamata tüübinimi"
|
msgstr "lõpetamata tüübinimi"
|
||||||
|
|
||||||
#: src/lex.c:437
|
#: src/lex.c:438
|
||||||
msgid "use \"...\" for multi-character literal tokens"
|
msgid "use \"...\" for multi-character literal tokens"
|
||||||
msgstr "kasuta mitmesümboliliste literaalidega \"...\" konstruktsiooni"
|
msgstr "kasuta mitmesümboliliste literaalidega \"...\" konstruktsiooni"
|
||||||
|
|
||||||
#: src/main.c:125
|
#: src/lex.c:667
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s: internal error: %s\n"
|
msgid "`%s' supports no argument: %s"
|
||||||
msgstr "%s: sisemine viga: %s\n"
|
msgstr "`%s' ei toeta argumente: %s"
|
||||||
|
|
||||||
#: src/nullable.c:51
|
#: src/lex.c:683
|
||||||
msgid "Entering set_nullable"
|
#, c-format
|
||||||
msgstr "Entering set_nullable"
|
msgid "`%s' requires an argument"
|
||||||
|
msgstr "võti `%s' nõuab argumenti"
|
||||||
|
|
||||||
#: src/output.c:986
|
#: src/output.c:949
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "maximum table size (%d) exceeded"
|
msgid "maximum table size (%d) exceeded"
|
||||||
msgstr "ületati maksimaalset tabelisuurust (%d)"
|
msgstr "ületati maksimaalset tabelisuurust (%d)"
|
||||||
|
|
||||||
#: src/print.c:37
|
#: src/print.c:39
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid " type %d is %s\n"
|
msgid " type %d is %s\n"
|
||||||
msgstr " tüüp %d on %s\n"
|
msgstr " tüüp %d on %s\n"
|
||||||
|
|
||||||
#: src/print.c:85
|
#: src/print.c:88
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid " (rule %d)"
|
msgid " (rule %d)"
|
||||||
msgstr " (reegel %d)"
|
msgstr " (reegel %d)"
|
||||||
|
|
||||||
#: src/print.c:111
|
#: src/print.c:108
|
||||||
msgid " $default\taccept\n"
|
msgid " $default\taccept\n"
|
||||||
msgstr " $default\taktsepteerin\n"
|
msgstr " $default\taktsepteerin\n"
|
||||||
|
|
||||||
#: src/print.c:113
|
#: src/print.c:110
|
||||||
msgid " NO ACTIONS\n"
|
msgid " NO ACTIONS\n"
|
||||||
msgstr " TEGEVUSI POLE\n"
|
msgstr " TEGEVUSI POLE\n"
|
||||||
|
|
||||||
#: src/print.c:132
|
#: src/print.c:124
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid " $ \tgo to state %d\n"
|
msgid " $ \tgo to state %d\n"
|
||||||
msgstr " $ \tliigu olekule %d\n"
|
msgstr " $ \tliigu olekule %d\n"
|
||||||
|
|
||||||
#: src/print.c:135
|
#: src/print.c:127
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid " %-4s\tshift, and go to state %d\n"
|
msgid " %-4s\tshift, and go to state %d\n"
|
||||||
msgstr " %-4s\tnihuta ja liigu olekule %d\n"
|
msgstr " %-4s\tnihuta ja liigu olekule %d\n"
|
||||||
|
|
||||||
#: src/print.c:159
|
#: src/print.c:142
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid " %-4s\terror (nonassociative)\n"
|
msgid " %-4s\terror (nonassociative)\n"
|
||||||
msgstr " %-4s\tviga (mitteassotsiatiivne)\n"
|
msgstr " %-4s\tviga (mitteassotsiatiivne)\n"
|
||||||
|
|
||||||
#: src/print.c:187
|
#: src/print.c:169
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid " %-4s\tgo to state %d\n"
|
msgid " %-4s\tgo to state %d\n"
|
||||||
msgstr " %-4s\tliigu olekule %d\n"
|
msgstr " %-4s\tliigu olekule %d\n"
|
||||||
|
|
||||||
#: src/print.c:199
|
#: src/print.c:180
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "state %d"
|
msgid "state %d"
|
||||||
msgstr "olek %d"
|
msgstr "olek %d"
|
||||||
|
|
||||||
#. rule # : LHS -> RHS
|
#. rule # : LHS -> RHS
|
||||||
#: src/print.c:229
|
#: src/print.c:211
|
||||||
msgid "Grammar"
|
msgid "Grammar"
|
||||||
msgstr "Grammatika"
|
msgstr "Grammatika"
|
||||||
|
|
||||||
#: src/print.c:234
|
#: src/print.c:212
|
||||||
#, c-format
|
msgid "Number, Line, Rule"
|
||||||
msgid "rule %-4d %s ->"
|
msgstr "Number, rida, reegel"
|
||||||
msgstr "reegel %-4d %s ->"
|
|
||||||
|
|
||||||
#: src/print.c:240
|
#: src/print.c:217
|
||||||
|
#, c-format
|
||||||
|
msgid " %3d %3d %s ->"
|
||||||
|
msgstr " %3d %3d %s ->"
|
||||||
|
|
||||||
|
#: src/print.c:224
|
||||||
msgid "empty"
|
msgid "empty"
|
||||||
msgstr ""
|
msgstr "tühi"
|
||||||
|
|
||||||
#. TERMINAL (type #) : rule #s terminal is on RHS
|
#. TERMINAL (type #) : rule #s terminal is on RHS
|
||||||
#: src/print.c:244
|
#: src/print.c:231
|
||||||
msgid "Terminals, with rules where they appear"
|
msgid "Terminals, with rules where they appear"
|
||||||
msgstr "Terminalid, koos reeglitega, kus nad ilmuvad"
|
msgstr "Terminalid, koos reeglitega, kus nad ilmuvad"
|
||||||
|
|
||||||
#: src/print.c:268
|
#: src/print.c:256
|
||||||
msgid "Nonterminals, with rules where they appear"
|
msgid "Nonterminals, with rules where they appear"
|
||||||
msgstr "Mitteterminalid, koos reeglitega, kus nad ilmuvad"
|
msgstr "Mitteterminalid, koos reeglitega, kus nad ilmuvad"
|
||||||
|
|
||||||
#: src/print.c:294
|
#: src/print.c:282
|
||||||
msgid " on left:"
|
msgid " on left:"
|
||||||
msgstr " vasakul:"
|
msgstr " vasakul:"
|
||||||
|
|
||||||
#: src/print.c:309
|
#: src/print.c:297
|
||||||
msgid " on right:"
|
msgid " on right:"
|
||||||
msgstr " paremal:"
|
msgstr " paremal:"
|
||||||
|
|
||||||
#: src/print_graph.c:174
|
#. If something has been added in the NODE_OBSTACK after
|
||||||
|
#. the declaration of the label, then we need a `\n'.
|
||||||
|
#. if (obstack_object_size (node_obstack) > node_output_size)
|
||||||
|
#. obstack_sgrow (node_obstack, "\n");
|
||||||
|
#.
|
||||||
|
#: src/print_graph.c:146
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%-4s\terror (nonassociative)"
|
msgid "%-4s\terror (nonassociative)"
|
||||||
msgstr "%-4s\tviga (mitteassotsiatiivne)"
|
msgstr "%-4s\tviga (mitteassotsiatiivne)"
|
||||||
|
|
||||||
#: src/print_graph.c:187
|
#.
|
||||||
|
#. if (obstack_object_size (node_obstack) > node_output_size)
|
||||||
|
#. obstack_sgrow (node_obstack, "\n");
|
||||||
|
#.
|
||||||
|
#: src/print_graph.c:161
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "$default\treduce using rule %d (%s)"
|
msgid "$default\treduce using rule %d (%s)"
|
||||||
msgstr "$default\tredutseerin kasutades reeglit %d (%s)"
|
msgstr "$default\tredutseerin kasutades reeglit %d (%s)"
|
||||||
|
|
||||||
#: src/reader.c:78
|
#: src/reader.c:89
|
||||||
msgid " Skipping to next \\n"
|
msgid " Skipping to next \\n"
|
||||||
msgstr " Liigun järgmisele \\n"
|
msgstr " Liigun järgmisele \\n"
|
||||||
|
|
||||||
#: src/reader.c:80
|
#: src/reader.c:91
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid " Skipping to next %c"
|
msgid " Skipping to next %c"
|
||||||
msgstr " Liigun järgmisele %c"
|
msgstr " Liigun järgmisele %c"
|
||||||
|
|
||||||
#: src/reader.c:131 src/reader.c:143
|
#: src/reader.c:142 src/reader.c:154
|
||||||
msgid "invalid $ value"
|
msgid "invalid $ value"
|
||||||
msgstr "vigane $ väärtus"
|
msgstr "vigane $ väärtus"
|
||||||
|
|
||||||
#: src/reader.c:169 src/reader.c:184
|
#: src/reader.c:180 src/reader.c:195
|
||||||
msgid "unterminated string at end of file"
|
msgid "unterminated string at end of file"
|
||||||
msgstr "lõpetamata sõne faili lõpus"
|
msgstr "lõpetamata sõne faili lõpus"
|
||||||
|
|
||||||
#: src/reader.c:172
|
#: src/reader.c:183
|
||||||
msgid "unterminated string"
|
msgid "unterminated string"
|
||||||
msgstr "lõpetamata sõne"
|
msgstr "lõpetamata sõne"
|
||||||
|
|
||||||
#: src/reader.c:325 src/reader.c:389
|
#: src/reader.c:336 src/reader.c:400
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s is invalid"
|
msgid "%s is invalid"
|
||||||
msgstr "%s on vigane"
|
msgstr "%s on vigane"
|
||||||
|
|
||||||
#: src/reader.c:365
|
#: src/reader.c:376
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "$$ of `%s' has no declared type"
|
msgid "$$ of `%s' has no declared type"
|
||||||
msgstr "`%s' $$ ei oma deklareeritud tüüpi"
|
msgstr "`%s' $$ ei oma deklareeritud tüüpi"
|
||||||
|
|
||||||
#: src/reader.c:382
|
#: src/reader.c:393
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "$%d of `%s' has no declared type"
|
msgid "$%d of `%s' has no declared type"
|
||||||
msgstr "$%d `%s' ei oma deklareeritud tüüpi"
|
msgstr "$%d `%s' ei oma deklareeritud tüüpi"
|
||||||
|
|
||||||
#: src/reader.c:436
|
#: src/reader.c:447
|
||||||
msgid "unterminated `%{' definition"
|
msgid "unterminated `%{' definition"
|
||||||
msgstr "lõpetamata `%{' definitsioon"
|
msgstr "lõpetamata `%{' definitsioon"
|
||||||
|
|
||||||
#: src/reader.c:481 src/reader.c:595 src/reader.c:645
|
#: src/reader.c:492 src/reader.c:607 src/reader.c:657
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Premature EOF after %s"
|
msgid "Premature EOF after %s"
|
||||||
msgstr "Enneaegne EOF peale %s"
|
msgstr "Enneaegne EOF peale %s"
|
||||||
|
|
||||||
#: src/reader.c:498
|
#: src/reader.c:509
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "symbol `%s' used more than once as a literal string"
|
msgid "symbol `%s' used more than once as a literal string"
|
||||||
msgstr "sümbolit `%s' on kasutatud enam kui kord literaal sõnena"
|
msgstr "sümbolit `%s' on kasutatud enam kui kord literaal sõnena"
|
||||||
|
|
||||||
#: src/reader.c:501
|
#: src/reader.c:512
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "symbol `%s' given more than one literal string"
|
msgid "symbol `%s' given more than one literal string"
|
||||||
msgstr "sümbolile `%s' on antud enam kui üks literaal sõne"
|
msgstr "sümbolile `%s' on antud enam kui üks literaal sõne"
|
||||||
|
|
||||||
#: src/reader.c:522 src/reader.c:664
|
#: src/reader.c:533 src/reader.c:676
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "symbol %s redefined"
|
msgid "symbol %s redefined"
|
||||||
msgstr "sümbol %s on uuesti defineeritud"
|
msgstr "sümbol %s on uuesti defineeritud"
|
||||||
|
|
||||||
#: src/reader.c:532 src/reader.c:610 src/reader.c:671 src/reader.c:1285
|
#: src/reader.c:543 src/reader.c:622 src/reader.c:683 src/reader.c:1292
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "type redeclaration for %s"
|
msgid "type redeclaration for %s"
|
||||||
msgstr "%s tüübi uuesti deklareerimine"
|
msgstr "%s tüübi uuesti deklareerimine"
|
||||||
|
|
||||||
#: src/reader.c:541
|
#: src/reader.c:552
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "`%s' is invalid in %s"
|
msgid "`%s' is invalid in %s"
|
||||||
msgstr "`%s' ei ole %s sees lubatud"
|
msgstr "`%s' ei ole %s sees lubatud"
|
||||||
|
|
||||||
#: src/reader.c:558 src/reader.c:717
|
#: src/reader.c:570 src/reader.c:735
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "multiple %s declarations"
|
msgid "multiple %s declarations"
|
||||||
msgstr "korduvad %s deklaratsioonid"
|
msgstr "korduvad %s deklaratsioonid"
|
||||||
|
|
||||||
#: src/reader.c:560 src/reader.c:897 src/reader.c:922 src/reader.c:1263
|
#: src/reader.c:572 src/reader.c:914 src/reader.c:939 src/reader.c:1270
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "invalid %s declaration"
|
msgid "invalid %s declaration"
|
||||||
msgstr "vigane %s deklaratsioon"
|
msgstr "vigane %s deklaratsioon"
|
||||||
|
|
||||||
#: src/reader.c:580
|
#: src/reader.c:592
|
||||||
msgid "%type declaration has no <typename>"
|
msgid "%type declaration has no <typename>"
|
||||||
msgstr "%type deklaratsioonis puudub <tüübinimi>"
|
msgstr "%type deklaratsioonis puudub <tüübinimi>"
|
||||||
|
|
||||||
#: src/reader.c:615
|
#: src/reader.c:627
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "invalid %%type declaration due to item: %s"
|
msgid "invalid %%type declaration due to item: %s"
|
||||||
msgstr "vigane %%type deklaratsioon, element: %s"
|
msgstr "vigane %%type deklaratsioon, element: %s"
|
||||||
|
|
||||||
#: src/reader.c:660
|
#: src/reader.c:672
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "redefining precedence of %s"
|
msgid "redefining precedence of %s"
|
||||||
msgstr "%s prioriteedi uus definitsioon"
|
msgstr "%s prioriteedi uus definitsioon"
|
||||||
|
|
||||||
#: src/reader.c:683
|
#: src/reader.c:695
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "invalid text (%s) - number should be after identifier"
|
msgid "invalid text (%s) - number should be after identifier"
|
||||||
msgstr "vigane tekst (%s) - number peab olema peale identifikaatorit"
|
msgstr "vigane tekst (%s) - number peab olema peale identifikaatorit"
|
||||||
|
|
||||||
#: src/reader.c:693
|
#: src/reader.c:705
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "unexpected item: %s"
|
msgid "unexpected item: %s"
|
||||||
msgstr "ootamatu element: %s"
|
msgstr "ootamatu element: %s"
|
||||||
|
|
||||||
#: src/reader.c:760 src/reader.c:1089 src/reader.c:1160
|
#: src/reader.c:778 src/reader.c:1110 src/reader.c:1181
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "unmatched %s"
|
msgid "unmatched %s"
|
||||||
msgstr "puudub %s"
|
msgstr "puudub %s"
|
||||||
|
|
||||||
#: src/reader.c:792
|
#: src/reader.c:810
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "argument of %%expect is not an integer"
|
msgid "argument of %%expect is not an integer"
|
||||||
msgstr "%%expect argument ei ole täisarv"
|
msgstr "%%expect argument ei ole täisarv"
|
||||||
|
|
||||||
#: src/reader.c:838
|
#: src/reader.c:856
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "unrecognized item %s, expected an identifier"
|
msgid "unrecognized item %s, expected an identifier"
|
||||||
msgstr "tundmatu element %s, eeldasin identifikaatorit"
|
msgstr "tundmatu element %s, eeldasin identifikaatorit"
|
||||||
|
|
||||||
#: src/reader.c:862
|
#: src/reader.c:878
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "expected string constant instead of %s"
|
msgid "expected string constant instead of %s"
|
||||||
msgstr "eeldasin %s asemel sõnekonstanti"
|
msgstr "eeldasin %s asemel sõnekonstanti"
|
||||||
|
|
||||||
#: src/reader.c:1005
|
#: src/reader.c:1026
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "unrecognized: %s"
|
msgid "unrecognized: %s"
|
||||||
msgstr "tundmatu: %s"
|
msgstr "tundmatu: %s"
|
||||||
|
|
||||||
#: src/reader.c:1010
|
#: src/reader.c:1031
|
||||||
msgid "no input grammar"
|
msgid "no input grammar"
|
||||||
msgstr "sisendgrammatikat pole"
|
msgstr "sisendgrammatikat pole"
|
||||||
|
|
||||||
#: src/reader.c:1015
|
#: src/reader.c:1036
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "unknown character: %s"
|
msgid "unknown character: %s"
|
||||||
msgstr "tundmatu sümbol: %s"
|
msgstr "tundmatu sümbol: %s"
|
||||||
|
|
||||||
#: src/reader.c:1183
|
#: src/reader.c:1204
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "unterminated %guard clause"
|
msgid "unterminated %guard clause"
|
||||||
msgstr "lõpetamata %guard klausel"
|
msgstr "lõpetamata %guard klausel"
|
||||||
|
|
||||||
#: src/reader.c:1350
|
#: src/reader.c:1357
|
||||||
msgid "ill-formed rule: initial symbol not followed by colon"
|
msgid "ill-formed rule: initial symbol not followed by colon"
|
||||||
msgstr "vigaselt formeeritud reegel: algsümbolile ei järgne koolonit"
|
msgstr "vigaselt formeeritud reegel: algsümbolile ei järgne koolonit"
|
||||||
|
|
||||||
#: src/reader.c:1357
|
#: src/reader.c:1364
|
||||||
msgid "grammar starts with vertical bar"
|
msgid "grammar starts with vertical bar"
|
||||||
msgstr "grammatika algab püstkriipsuga"
|
msgstr "grammatika algab püstkriipsuga"
|
||||||
|
|
||||||
#: src/reader.c:1388
|
#: src/reader.c:1392
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "rule given for %s, which is a token"
|
msgid "rule given for %s, which is a token"
|
||||||
msgstr "%s jaoks on antud reegel, aga see on märk"
|
msgstr "%s jaoks on antud reegel, aga see on märk"
|
||||||
|
|
||||||
#: src/reader.c:1490
|
#: src/reader.c:1492
|
||||||
msgid "two @prec's in a row"
|
msgid "two @prec's in a row"
|
||||||
msgstr "kaks @prec ühel real"
|
msgstr "kaks @prec ühel real"
|
||||||
|
|
||||||
#: src/reader.c:1498
|
#: src/reader.c:1500
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%%guard present but %%semantic_parser not specified"
|
msgid "%%guard present but %%semantic_parser not specified"
|
||||||
msgstr "%%guard on määratud, aga %%semantic_parser ei ole"
|
msgstr "%%guard on määratud, aga %%semantic_parser ei ole"
|
||||||
|
|
||||||
#: src/reader.c:1507
|
#: src/reader.c:1509
|
||||||
msgid "two actions at end of one rule"
|
msgid "two actions at end of one rule"
|
||||||
msgstr "kaks tegevust ühe reegli lõpus"
|
msgstr "kaks tegevust ühe reegli lõpus"
|
||||||
|
|
||||||
#: src/reader.c:1521
|
#: src/reader.c:1523
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "type clash (`%s' `%s') on default action"
|
msgid "type clash (`%s' `%s') on default action"
|
||||||
msgstr "vaikimisi tegevuse tüübikonflikt (`%s' `%s')"
|
msgstr "vaikimisi tegevuse tüübikonflikt (`%s' `%s')"
|
||||||
|
|
||||||
#: src/reader.c:1527
|
#: src/reader.c:1529
|
||||||
msgid "empty rule for typed nonterminal, and no action"
|
msgid "empty rule for typed nonterminal, and no action"
|
||||||
msgstr "tüübiga mitteterminalil on tühi reegel ja puudub tegevus"
|
msgstr "tüübiga mitteterminalil on tühi reegel ja puudub tegevus"
|
||||||
|
|
||||||
#: src/reader.c:1571
|
#: src/reader.c:1573
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "invalid input: %s"
|
msgid "invalid input: %s"
|
||||||
msgstr "vigane sisend: %s"
|
msgstr "vigane sisend: %s"
|
||||||
|
|
||||||
#: src/reader.c:1579
|
#: src/reader.c:1581
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "too many symbols (tokens plus nonterminals); maximum %d"
|
msgid "too many symbols (tokens plus nonterminals); maximum %d"
|
||||||
msgstr "liiga palju sümboleid (märgid ja mitteterminalid); maksimaalne on %d"
|
msgstr "liiga palju sümboleid (märgid ja mitteterminalid); maksimaalne on %d"
|
||||||
|
|
||||||
#: src/reader.c:1582
|
#: src/reader.c:1584
|
||||||
msgid "no rules in the input grammar"
|
msgid "no rules in the input grammar"
|
||||||
msgstr "sisendgrammatikas pole reegleid"
|
msgstr "sisendgrammatikas pole reegleid"
|
||||||
|
|
||||||
#: src/reader.c:1606
|
#: src/reader.c:1608
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "symbol %s is used, but is not defined as a token and has no rules"
|
msgid "symbol %s is used, but is not defined as a token and has no rules"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"kasutatakse sümbolit %s, mis ei ole defineeritud märgina ja millel puuduvad "
|
"kasutatakse sümbolit %s, mis ei ole defineeritud märgina ja millel puuduvad "
|
||||||
"reeglid"
|
"reeglid"
|
||||||
|
|
||||||
#: src/reader.c:1712
|
#: src/reader.c:1743
|
||||||
#, c-format
|
|
||||||
msgid "conflicting precedences for %s and %s"
|
|
||||||
msgstr "%s ja %s omavad konfliktseid prioriteete"
|
|
||||||
|
|
||||||
#: src/reader.c:1724
|
|
||||||
#, c-format
|
|
||||||
msgid "conflicting assoc values for %s and %s"
|
|
||||||
msgstr "%s ja %s omavad konfliktseid assotsiatiivseid väärtuseid"
|
|
||||||
|
|
||||||
#: src/reader.c:1770
|
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "tokens %s and %s both assigned number %d"
|
msgid "tokens %s and %s both assigned number %d"
|
||||||
msgstr "märkidele %s ja %s on mõlemale omistatud number %d"
|
msgstr "märkidele %s ja %s on mõlemale omistatud number %d"
|
||||||
|
|
||||||
#: src/reader.c:1782
|
#: src/reader.c:1796
|
||||||
|
#, c-format
|
||||||
|
msgid "conflicting precedences for %s and %s"
|
||||||
|
msgstr "%s ja %s omavad konfliktseid prioriteete"
|
||||||
|
|
||||||
|
#: src/reader.c:1808
|
||||||
|
#, c-format
|
||||||
|
msgid "conflicting assoc values for %s and %s"
|
||||||
|
msgstr "%s ja %s omavad konfliktseid assotsiatiivseid väärtuseid"
|
||||||
|
|
||||||
|
#: src/reader.c:1847
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "the start symbol %s is undefined"
|
msgid "the start symbol %s is undefined"
|
||||||
msgstr "stardisümbol %s ei ole defineeritud"
|
msgstr "stardisümbol %s ei ole defineeritud"
|
||||||
|
|
||||||
#: src/reader.c:1784
|
#: src/reader.c:1849
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "the start symbol %s is a token"
|
msgid "the start symbol %s is a token"
|
||||||
msgstr "stardisümbol %s on märk"
|
msgstr "stardisümbol %s on märk"
|
||||||
|
|
||||||
#: src/reduce.c:401
|
#: src/reduce.c:409
|
||||||
msgid "Useless nonterminals:"
|
msgid "Useless nonterminals:"
|
||||||
msgstr "Kasutamata mitteterminalid:"
|
msgstr "Kasutamata mitteterminalid:"
|
||||||
|
|
||||||
#: src/reduce.c:416
|
#: src/reduce.c:422
|
||||||
msgid "Terminals which are not used:"
|
msgid "Terminals which are not used:"
|
||||||
msgstr "Terminalid, mida ei kasutatud:"
|
msgstr "Terminalid, mida ei kasutatud:"
|
||||||
|
|
||||||
#: src/reduce.c:427
|
#: src/reduce.c:433
|
||||||
msgid "Useless rules:"
|
msgid "Useless rules:"
|
||||||
msgstr "Kasutamata reeglid:"
|
msgstr "Kasutamata reeglid:"
|
||||||
|
|
||||||
#: src/reduce.c:456
|
#: src/reduce.c:503
|
||||||
msgid ""
|
#, fuzzy, c-format
|
||||||
"Variables\n"
|
msgid "%d rule never reduced\n"
|
||||||
"---------\n"
|
msgid_plural "%d rules never reduced\n"
|
||||||
"\n"
|
msgstr[0] "%d reeglit ei redutseeritud\n"
|
||||||
msgstr ""
|
|
||||||
"Muutujad\n"
|
|
||||||
"--------\n"
|
|
||||||
"\n"
|
|
||||||
|
|
||||||
#: src/reduce.c:458
|
#: src/reduce.c:511
|
||||||
msgid "Value Sprec Sassoc Tag\n"
|
#, fuzzy, c-format
|
||||||
msgstr "Value Sprec Sassoc Tag\n"
|
msgid "%d useless nonterminal"
|
||||||
|
msgid_plural "%d useless nonterminals"
|
||||||
|
msgstr[0] "%d kasutamata mitteterminali%s"
|
||||||
|
|
||||||
#: src/reduce.c:463
|
#: src/reduce.c:517
|
||||||
msgid ""
|
|
||||||
"Rules\n"
|
|
||||||
"-----\n"
|
|
||||||
"\n"
|
|
||||||
msgstr ""
|
|
||||||
"Reeglid\n"
|
|
||||||
"-------\n"
|
|
||||||
"\n"
|
|
||||||
|
|
||||||
#: src/reduce.c:474
|
|
||||||
msgid ""
|
|
||||||
"Rules interpreted\n"
|
|
||||||
"-----------------\n"
|
|
||||||
"\n"
|
|
||||||
msgstr ""
|
|
||||||
"Interpreteeritud reeglid\n"
|
|
||||||
"------------------------\n"
|
|
||||||
"\n"
|
|
||||||
|
|
||||||
#: src/reduce.c:491
|
|
||||||
#, c-format
|
|
||||||
msgid "%d rules never reduced\n"
|
|
||||||
msgstr "%d reeglit ei redutseeritud\n"
|
|
||||||
|
|
||||||
#: src/reduce.c:493
|
|
||||||
#, c-format
|
|
||||||
msgid "%s contains "
|
|
||||||
msgstr "%s sisaldab "
|
|
||||||
|
|
||||||
#: src/reduce.c:497
|
|
||||||
#, c-format
|
|
||||||
msgid "%d useless nonterminal%s"
|
|
||||||
msgstr "%d kasutamata mitteterminali%s"
|
|
||||||
|
|
||||||
#: src/reduce.c:502
|
|
||||||
msgid " and "
|
msgid " and "
|
||||||
msgstr " ja "
|
msgstr " ja "
|
||||||
|
|
||||||
#: src/reduce.c:506
|
#: src/reduce.c:520
|
||||||
#, c-format
|
#, fuzzy, c-format
|
||||||
msgid "%d useless rule%s"
|
msgid "%d useless rule"
|
||||||
msgstr "%d kasutamata reeglit%s"
|
msgid_plural "%d useless rules"
|
||||||
|
msgstr[0] "%d kasutamata reeglit%s"
|
||||||
|
|
||||||
#: src/reduce.c:539
|
#: src/reduce.c:551
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Start symbol %s does not derive any sentence"
|
msgid "Start symbol %s does not derive any sentence"
|
||||||
msgstr "Stardisümbolist %s ei tuletata ühtegi lauset"
|
msgstr "Stardisümbolist %s ei tuletata ühtegi lauset"
|
||||||
|
|
||||||
#: src/reduce.c:552
|
#: lib/getopt.c:694
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"reduced %s defines %d terminal%s, %d nonterminal%s, and %d production%s.\n"
|
|
||||||
msgstr ""
|
|
||||||
"redutseeritud %s defineerib %d terminali%s, %d mitteterminali%s ja %d reeglit"
|
|
||||||
"%s.\n"
|
|
||||||
|
|
||||||
#: lib/getopt.c:675
|
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s: option `%s' is ambiguous\n"
|
msgid "%s: option `%s' is ambiguous\n"
|
||||||
msgstr "%s: võti `%s' on segane\n"
|
msgstr "%s: võti `%s' on segane\n"
|
||||||
|
|
||||||
#: lib/getopt.c:700
|
#: lib/getopt.c:719
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s: option `--%s' doesn't allow an argument\n"
|
msgid "%s: option `--%s' doesn't allow an argument\n"
|
||||||
msgstr "%s: võti `--%s' ei luba argumenti\n"
|
msgstr "%s: võti `--%s' ei luba argumenti\n"
|
||||||
|
|
||||||
#: lib/getopt.c:705
|
#: lib/getopt.c:724
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s: option `%c%s' doesn't allow an argument\n"
|
msgid "%s: option `%c%s' doesn't allow an argument\n"
|
||||||
msgstr "%s: võti `%c%s' ei luba argumenti\n"
|
msgstr "%s: võti `%c%s' ei luba argumenti\n"
|
||||||
|
|
||||||
#: lib/getopt.c:723 lib/getopt.c:896
|
#: lib/getopt.c:742 lib/getopt.c:915
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s: option `%s' requires an argument\n"
|
msgid "%s: option `%s' requires an argument\n"
|
||||||
msgstr "%s: võti `%s' nõuab argumenti\n"
|
msgstr "%s: võti `%s' nõuab argumenti\n"
|
||||||
|
|
||||||
#. --option
|
#. --option
|
||||||
#: lib/getopt.c:752
|
#: lib/getopt.c:771
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s: unrecognized option `--%s'\n"
|
msgid "%s: unrecognized option `--%s'\n"
|
||||||
msgstr "%s: tundmatu võti `--%s'\n"
|
msgstr "%s: tundmatu võti `--%s'\n"
|
||||||
|
|
||||||
#. +option or -option
|
#. +option or -option
|
||||||
#: lib/getopt.c:756
|
#: lib/getopt.c:775
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s: unrecognized option `%c%s'\n"
|
msgid "%s: unrecognized option `%c%s'\n"
|
||||||
msgstr "%s: tundmatu võti `%c%s'\n"
|
msgstr "%s: tundmatu võti `%c%s'\n"
|
||||||
|
|
||||||
#. 1003.2 specifies the format of this message.
|
#. 1003.2 specifies the format of this message.
|
||||||
#: lib/getopt.c:782
|
#: lib/getopt.c:801
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s: illegal option -- %c\n"
|
msgid "%s: illegal option -- %c\n"
|
||||||
msgstr "%s: lubamatu võti -- %c\n"
|
msgstr "%s: lubamatu võti -- %c\n"
|
||||||
|
|
||||||
#: lib/getopt.c:785
|
#: lib/getopt.c:804
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s: invalid option -- %c\n"
|
msgid "%s: invalid option -- %c\n"
|
||||||
msgstr "%s: vigane võti -- %c\n"
|
msgstr "%s: vigane võti -- %c\n"
|
||||||
|
|
||||||
#. 1003.2 specifies the format of this message.
|
#. 1003.2 specifies the format of this message.
|
||||||
#: lib/getopt.c:815 lib/getopt.c:945
|
#: lib/getopt.c:834 lib/getopt.c:964
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s: option requires an argument -- %c\n"
|
msgid "%s: option requires an argument -- %c\n"
|
||||||
msgstr "%s: võti nõuab argumenti -- %c\n"
|
msgstr "%s: võti nõuab argumenti -- %c\n"
|
||||||
|
|
||||||
#: lib/getopt.c:862
|
#: lib/getopt.c:881
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s: option `-W %s' is ambiguous\n"
|
msgid "%s: option `-W %s' is ambiguous\n"
|
||||||
msgstr "%s: võti `-W %s' on segane\n"
|
msgstr "%s: võti `-W %s' on segane\n"
|
||||||
|
|
||||||
#: lib/getopt.c:880
|
#: lib/getopt.c:899
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s: option `-W %s' doesn't allow an argument\n"
|
msgid "%s: option `-W %s' doesn't allow an argument\n"
|
||||||
msgstr "%s: võti `-W %s' ei luba argumenti\n"
|
msgstr "%s: võti `-W %s' ei luba argumenti\n"
|
||||||
|
|
||||||
#. If XALLOC_FAIL_FUNC is NULL, or does return, display this message
|
#. If XALLOC_FAIL_FUNC is NULL, or does return, display this message
|
||||||
#. before exiting when memory is exhausted. Goes through gettext.
|
#. before exiting when memory is exhausted. Goes through gettext.
|
||||||
#: lib/obstack.c:477 lib/xmalloc.c:66
|
#: lib/obstack.c:494 lib/obstack.c:497 lib/xmalloc.c:66
|
||||||
msgid "memory exhausted"
|
msgid "memory exhausted"
|
||||||
msgstr "mälu on otsas"
|
msgstr "mälu on otsas"
|
||||||
|
|
||||||
@@ -783,19 +747,43 @@ msgstr "m
|
|||||||
#. MARK). A British English Unicode locale should instead
|
#. MARK). A British English Unicode locale should instead
|
||||||
#. translate these to U+2018 (LEFT SINGLE QUOTATION MARK) and
|
#. translate these to U+2018 (LEFT SINGLE QUOTATION MARK) and
|
||||||
#. U+2019 (RIGHT SINGLE QUOTATION MARK), respectively.
|
#. U+2019 (RIGHT SINGLE QUOTATION MARK), respectively.
|
||||||
#: lib/quotearg.c:268
|
#: lib/quotearg.c:274
|
||||||
msgid "`"
|
msgid "`"
|
||||||
msgstr "`"
|
msgstr "`"
|
||||||
|
|
||||||
#: lib/quotearg.c:269
|
#: lib/quotearg.c:275
|
||||||
msgid "'"
|
msgid "'"
|
||||||
msgstr "'"
|
msgstr "'"
|
||||||
|
|
||||||
#~ msgid "\t\t/* empty */"
|
#~ msgid "%s: internal error: %s\n"
|
||||||
#~ msgstr "\t\t/* tühi */"
|
#~ msgstr "%s: sisemine viga: %s\n"
|
||||||
|
|
||||||
#~ msgid "multiple %%header_extension declarations"
|
#~ msgid ""
|
||||||
#~ msgstr "korduvad %%header_extension eklaratsioonid"
|
#~ "Variables\n"
|
||||||
|
#~ "---------\n"
|
||||||
|
#~ "\n"
|
||||||
|
#~ msgstr ""
|
||||||
|
#~ "Muutujad\n"
|
||||||
|
#~ "--------\n"
|
||||||
|
#~ "\n"
|
||||||
|
|
||||||
#~ msgid "multiple %%source_extension declarations"
|
#~ msgid "Value Sprec Sassoc Tag\n"
|
||||||
#~ msgstr "korduvad %%source_extension deklaratsioonid"
|
#~ msgstr "Value Sprec Sassoc Tag\n"
|
||||||
|
|
||||||
|
#~ msgid ""
|
||||||
|
#~ "Rules\n"
|
||||||
|
#~ "-----\n"
|
||||||
|
#~ "\n"
|
||||||
|
#~ msgstr ""
|
||||||
|
#~ "Reeglid\n"
|
||||||
|
#~ "-------\n"
|
||||||
|
#~ "\n"
|
||||||
|
|
||||||
|
#~ msgid ""
|
||||||
|
#~ "Rules interpreted\n"
|
||||||
|
#~ "-----------------\n"
|
||||||
|
#~ "\n"
|
||||||
|
#~ msgstr ""
|
||||||
|
#~ "Interpreteeritud reeglid\n"
|
||||||
|
#~ "------------------------\n"
|
||||||
|
#~ "\n"
|
||||||
|
|||||||
@@ -0,0 +1,801 @@
|
|||||||
|
# Swedish messages for bison.
|
||||||
|
# Copyright © 2001 Free Software Foundation, Inc.
|
||||||
|
# Göran Uddeborg <[email protected]>, 2001.
|
||||||
|
# $Revision$
|
||||||
|
#
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: bison 1.30e\n"
|
||||||
|
"POT-Creation-Date: 2001-12-05 12:47+0100\n"
|
||||||
|
"PO-Revision-Date: 2001-11-27 11:16+0100\n"
|
||||||
|
"Last-Translator: Göran Uddeborg <[email protected]>\n"
|
||||||
|
"Language-Team: Swedish <[email protected]>\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=iso-8859-1\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
|
|
||||||
|
#: src/LR0.c:189
|
||||||
|
#, c-format
|
||||||
|
msgid "too many states (max %d)"
|
||||||
|
msgstr "för många tillstånd (max %d)"
|
||||||
|
|
||||||
|
#: lib/error.c:128 lib/error.c:156 src/complain.c:96
|
||||||
|
msgid "Unknown system error"
|
||||||
|
msgstr "Okänt systemfel"
|
||||||
|
|
||||||
|
#: src/complain.c:150
|
||||||
|
msgid "warning: "
|
||||||
|
msgstr "varning: "
|
||||||
|
|
||||||
|
#: src/complain.c:238
|
||||||
|
msgid "fatal error: "
|
||||||
|
msgstr "ödesdigert fel: "
|
||||||
|
|
||||||
|
#: src/conflicts.c:44
|
||||||
|
#, c-format
|
||||||
|
msgid "Conflict in state %d between rule %d and token %s resolved as %s.\n"
|
||||||
|
msgstr ""
|
||||||
|
"Konflikt i tillstånd %d mellan regel %d och element %s, löstes med %s.\n"
|
||||||
|
|
||||||
|
#: src/conflicts.c:94 src/conflicts.c:119
|
||||||
|
msgid "reduce"
|
||||||
|
msgstr "reducera"
|
||||||
|
|
||||||
|
#: src/conflicts.c:101 src/conflicts.c:115
|
||||||
|
msgid "shift"
|
||||||
|
msgstr "skifta"
|
||||||
|
|
||||||
|
#: src/conflicts.c:123
|
||||||
|
msgid "an error"
|
||||||
|
msgstr "ett fel"
|
||||||
|
|
||||||
|
#: src/conflicts.c:302
|
||||||
|
#, c-format
|
||||||
|
msgid "%d shift/reduce conflict"
|
||||||
|
msgid_plural "%d shift/reduce conflicts"
|
||||||
|
msgstr[0] "%d skifta/reducerakonflikt"
|
||||||
|
msgstr[1] "%d skifta/reducerakonflikter"
|
||||||
|
|
||||||
|
#: src/conflicts.c:309
|
||||||
|
msgid "and"
|
||||||
|
msgstr "och"
|
||||||
|
|
||||||
|
#: src/conflicts.c:315
|
||||||
|
#, c-format
|
||||||
|
msgid "%d reduce/reduce conflict"
|
||||||
|
msgid_plural "%d reduce/reduce conflicts"
|
||||||
|
msgstr[0] "%d reducera/reducerakonflikt"
|
||||||
|
msgstr[1] "%d reducera/reducerakonflikter"
|
||||||
|
|
||||||
|
#: src/conflicts.c:340
|
||||||
|
#, c-format
|
||||||
|
msgid "State %d contains "
|
||||||
|
msgstr "Tillstånd %d innehåller "
|
||||||
|
|
||||||
|
#. If invoked with `--yacc', use the output format specified by
|
||||||
|
#. POSIX.
|
||||||
|
#: src/conflicts.c:387
|
||||||
|
msgid "conflicts: "
|
||||||
|
msgstr "konflikter: "
|
||||||
|
|
||||||
|
#: src/conflicts.c:389
|
||||||
|
#, c-format
|
||||||
|
msgid " %d shift/reduce"
|
||||||
|
msgstr " %d skifta/reducera"
|
||||||
|
|
||||||
|
#: src/conflicts.c:393
|
||||||
|
#, c-format
|
||||||
|
msgid " %d reduce/reduce"
|
||||||
|
msgstr " %d reducera/reducera"
|
||||||
|
|
||||||
|
#: src/conflicts.c:398 src/reduce.c:508
|
||||||
|
#, c-format
|
||||||
|
msgid "%s contains "
|
||||||
|
msgstr "%s innehåller "
|
||||||
|
|
||||||
|
#: src/conflicts.c:405
|
||||||
|
#, c-format
|
||||||
|
msgid "expected %d shift/reduce conflict\n"
|
||||||
|
msgid_plural "expected %d shift/reduce conflicts\n"
|
||||||
|
msgstr[0] "förväntade %d skifta/reducerakonflikt\n"
|
||||||
|
msgstr[1] "förväntade %d skifta/reducerakonflikter\n"
|
||||||
|
|
||||||
|
#: src/conflicts.c:457 src/conflicts.c:534
|
||||||
|
#, c-format
|
||||||
|
msgid " %-4s\t[reduce using rule %d (%s)]\n"
|
||||||
|
msgstr " %-4s\t[reducera med regel %d (%s)]\n"
|
||||||
|
|
||||||
|
#: src/conflicts.c:461 src/print.c:154
|
||||||
|
#, c-format
|
||||||
|
msgid ""
|
||||||
|
" $default\treduce using rule %d (%s)\n"
|
||||||
|
"\n"
|
||||||
|
msgstr ""
|
||||||
|
" $standard\treducera med regel %d (%s)\n"
|
||||||
|
"\n"
|
||||||
|
|
||||||
|
#: src/conflicts.c:515 src/conflicts.c:528
|
||||||
|
#, c-format
|
||||||
|
msgid " %-4s\treduce using rule %d (%s)\n"
|
||||||
|
msgstr " %-4s\treducera med regel %d (%s)\n"
|
||||||
|
|
||||||
|
#: src/conflicts.c:544
|
||||||
|
#, c-format
|
||||||
|
msgid " $default\treduce using rule %d (%s)\n"
|
||||||
|
msgstr " $standard\treducera med regel %d (%s)\n"
|
||||||
|
|
||||||
|
#: src/files.c:144
|
||||||
|
#, c-format
|
||||||
|
msgid "cannot open file `%s'"
|
||||||
|
msgstr "kan inte öppna filen \"%s\""
|
||||||
|
|
||||||
|
#: src/files.c:163
|
||||||
|
msgid "cannot close file"
|
||||||
|
msgstr "kan inte stänga fil"
|
||||||
|
|
||||||
|
#. Some efforts were made to ease the translators' task, please
|
||||||
|
#. continue.
|
||||||
|
#: src/getargs.c:84
|
||||||
|
msgid "GNU bison generates parsers for LALR(1) grammars.\n"
|
||||||
|
msgstr "GNU bison genererar parsrar för LALR(1)-grammatiker.\n"
|
||||||
|
|
||||||
|
#: src/getargs.c:88
|
||||||
|
#, c-format
|
||||||
|
msgid "Usage: %s [OPTION]... FILE\n"
|
||||||
|
msgstr "Användning: %s [FLAGGA]... FIL\n"
|
||||||
|
|
||||||
|
#: src/getargs.c:92
|
||||||
|
msgid ""
|
||||||
|
"If a long option shows an argument as mandatory, then it is mandatory\n"
|
||||||
|
"for the equivalent short option also. Similarly for optional arguments.\n"
|
||||||
|
msgstr ""
|
||||||
|
"Om en lång flagga visar ett argument som obligatoriskt är det\n"
|
||||||
|
"obligatoriskt för den motsvarande korta flaggan också. Motsvarande\n"
|
||||||
|
"för valfria argument.\n"
|
||||||
|
|
||||||
|
#: src/getargs.c:98
|
||||||
|
msgid ""
|
||||||
|
"Operation modes:\n"
|
||||||
|
" -h, --help display this help and exit\n"
|
||||||
|
" -V, --version output version information and exit\n"
|
||||||
|
" -y, --yacc emulate POSIX yacc\n"
|
||||||
|
msgstr ""
|
||||||
|
"Arbetslägen:\n"
|
||||||
|
" -h, --help visa denna hjälptext och avsluta\n"
|
||||||
|
" -V, --version visa versionsinformation och avsluta\n"
|
||||||
|
" -y, --yacc emulera POSIX-yacc\n"
|
||||||
|
|
||||||
|
#: src/getargs.c:105
|
||||||
|
msgid ""
|
||||||
|
"Parser:\n"
|
||||||
|
" -S, --skeleton=FILE specify the skeleton to use\n"
|
||||||
|
" -t, --debug instrument the parser for debugging\n"
|
||||||
|
" --locations enable locations computation\n"
|
||||||
|
" -p, --name-prefix=PREFIX prepend PREFIX to the external symbols\n"
|
||||||
|
" -l, --no-lines don't generate `#line' directives\n"
|
||||||
|
" -n, --no-parser generate the tables only\n"
|
||||||
|
" -k, --token-table include a table of token names\n"
|
||||||
|
msgstr ""
|
||||||
|
"Tolk:\n"
|
||||||
|
" -S, --skeleton=FIL ange skelettfilen som skall användas\n"
|
||||||
|
" -t, --debug instrumentera tolken för felsökning\n"
|
||||||
|
" --locations aktivera lägesberäkning\n"
|
||||||
|
" -p, --name-prefix=PREFIX lägg till PREFIX före externa symboler\n"
|
||||||
|
" -l, --no-lines generera inte \"#line\"-direktiv\n"
|
||||||
|
" -n, --no-parser generera endast tabellerna\n"
|
||||||
|
" -k, --token-table inkludera en tabell över elementnamn\n"
|
||||||
|
|
||||||
|
#: src/getargs.c:117
|
||||||
|
msgid ""
|
||||||
|
"Output:\n"
|
||||||
|
" -d, --defines also produce a header file\n"
|
||||||
|
" -v, --verbose also produce an explanation of the automaton\n"
|
||||||
|
" -b, --file-prefix=PREFIX specify a PREFIX for output files\n"
|
||||||
|
" -o, --output=FILE leave output to FILE\n"
|
||||||
|
" -g, --graph also produce a VCG description of the "
|
||||||
|
"automaton\n"
|
||||||
|
msgstr ""
|
||||||
|
"Utdata:\n"
|
||||||
|
" -d, --defines skapa också en huvudfil\n"
|
||||||
|
" -v, --verbose skapa också en förklaring av automaten\n"
|
||||||
|
" -b, --file-prefix=PREFIX ange ett PREFIX för utdatafiler\n"
|
||||||
|
" -o, --output=FIL lägg utdata i FIL\n"
|
||||||
|
" -g, --graph skapa också en VCG-beskrivning av automaten\n"
|
||||||
|
|
||||||
|
#: src/getargs.c:127
|
||||||
|
msgid "Report bugs to <[email protected]>.\n"
|
||||||
|
msgstr ""
|
||||||
|
"Rapportera fel till <[email protected]>.\n"
|
||||||
|
"Rapportera anmärkningar på översättningen till <[email protected]>.\n"
|
||||||
|
|
||||||
|
#. Some efforts were made to ease the translators' task, please
|
||||||
|
#. continue.
|
||||||
|
#: src/getargs.c:141
|
||||||
|
#, c-format
|
||||||
|
msgid "bison (GNU Bison) %s"
|
||||||
|
msgstr "bison (GNU Bison) %s"
|
||||||
|
|
||||||
|
#: src/getargs.c:146
|
||||||
|
msgid ""
|
||||||
|
"Copyright 1984, 1986, 1989, 1992, 2000, 2001 Free Software Foundation, Inc.\n"
|
||||||
|
msgstr ""
|
||||||
|
"Copyright 1984, 1986, 1989, 1992, 2000, 2001 Free Software Foundation, Inc.\n"
|
||||||
|
|
||||||
|
#: src/getargs.c:150
|
||||||
|
msgid ""
|
||||||
|
"This is free software; see the source for copying conditions. There is NO\n"
|
||||||
|
"warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
|
||||||
|
msgstr ""
|
||||||
|
"Detta är fri programvara, se källkoden för kopieringsvillkor. Det\n"
|
||||||
|
"finns INGEN garanti, inte ens för SÄLJBARHET eller LÄMPLIGHET FÖR ETT\n"
|
||||||
|
"SPECIELLT ÄNDAMÅL.\n"
|
||||||
|
|
||||||
|
#: src/getargs.c:215 src/lex.c:694
|
||||||
|
#, c-format
|
||||||
|
msgid "`%s' is no longer supported"
|
||||||
|
msgstr "\"%s\" stöds inte längre"
|
||||||
|
|
||||||
|
#: src/getargs.c:239
|
||||||
|
#, c-format
|
||||||
|
msgid "Try `%s --help' for more information.\n"
|
||||||
|
msgstr "Försök med \"%s --help\" för mer information.\n"
|
||||||
|
|
||||||
|
#: src/getargs.c:246
|
||||||
|
#, c-format
|
||||||
|
msgid "%s: no grammar file given\n"
|
||||||
|
msgstr "%s: ingen grammatikfil angiven\n"
|
||||||
|
|
||||||
|
#: src/getargs.c:250
|
||||||
|
#, c-format
|
||||||
|
msgid "%s: extra arguments ignored after `%s'\n"
|
||||||
|
msgstr "%s: extra argument ignorerade efter \"%s\"\n"
|
||||||
|
|
||||||
|
#: src/lalr.c:255
|
||||||
|
#, c-format
|
||||||
|
msgid "too many gotos (max %d)"
|
||||||
|
msgstr "för många goto (max %d)"
|
||||||
|
|
||||||
|
#: src/lex.c:76
|
||||||
|
msgid "unexpected `/' found and ignored"
|
||||||
|
msgstr "oväntat \"/\" hittat och ignorerat"
|
||||||
|
|
||||||
|
#: src/lex.c:105 src/reader.c:280
|
||||||
|
msgid "unterminated comment"
|
||||||
|
msgstr "oavslutad kommentar"
|
||||||
|
|
||||||
|
#: src/lex.c:137
|
||||||
|
msgid "unexpected end of file"
|
||||||
|
msgstr "oväntat filslut"
|
||||||
|
|
||||||
|
#: src/lex.c:166
|
||||||
|
msgid "unescaped newline in constant"
|
||||||
|
msgstr "oskyddat nyradstecken i konstant"
|
||||||
|
|
||||||
|
#: src/lex.c:208
|
||||||
|
#, c-format
|
||||||
|
msgid "octal value outside range 0...255: `\\%o'"
|
||||||
|
msgstr "oktalt värde utanför intervallet 0-255: \"\\%o\""
|
||||||
|
|
||||||
|
#: src/lex.c:233
|
||||||
|
#, c-format
|
||||||
|
msgid "hexadecimal value above 255: `\\x%x'"
|
||||||
|
msgstr "hexadecimalt värde över 255: \"\\x%x\""
|
||||||
|
|
||||||
|
#: src/lex.c:245
|
||||||
|
#, c-format
|
||||||
|
msgid "unknown escape sequence: `\\' followed by `%s'"
|
||||||
|
msgstr "okänd specialsekvens: \"\\\" följt av \"%s\""
|
||||||
|
|
||||||
|
#: src/lex.c:342
|
||||||
|
msgid "unterminated type name at end of file"
|
||||||
|
msgstr "oavslutat typnamn vid filslut"
|
||||||
|
|
||||||
|
#: src/lex.c:345
|
||||||
|
msgid "unterminated type name"
|
||||||
|
msgstr "oavslutat typnamn"
|
||||||
|
|
||||||
|
#: src/lex.c:438
|
||||||
|
msgid "use \"...\" for multi-character literal tokens"
|
||||||
|
msgstr "använd \"...\" för bokstavliga element med mer än ett tecken"
|
||||||
|
|
||||||
|
#: src/lex.c:667
|
||||||
|
#, c-format
|
||||||
|
msgid "`%s' supports no argument: %s"
|
||||||
|
msgstr "\"%s\" stödjer inga argument: %s"
|
||||||
|
|
||||||
|
#: src/lex.c:683
|
||||||
|
#, c-format
|
||||||
|
msgid "`%s' requires an argument"
|
||||||
|
msgstr "\"%s\" behöver ett argument"
|
||||||
|
|
||||||
|
#: src/output.c:949
|
||||||
|
#, c-format
|
||||||
|
msgid "maximum table size (%d) exceeded"
|
||||||
|
msgstr "maximal tabellstorlek (%d) överskriden"
|
||||||
|
|
||||||
|
#: src/print.c:39
|
||||||
|
#, c-format
|
||||||
|
msgid " type %d is %s\n"
|
||||||
|
msgstr " typ %d är %s\n"
|
||||||
|
|
||||||
|
#: src/print.c:88
|
||||||
|
#, c-format
|
||||||
|
msgid " (rule %d)"
|
||||||
|
msgstr " (regel %d)"
|
||||||
|
|
||||||
|
#: src/print.c:108
|
||||||
|
msgid " $default\taccept\n"
|
||||||
|
msgstr " $standard\tacceptera\n"
|
||||||
|
|
||||||
|
#: src/print.c:110
|
||||||
|
msgid " NO ACTIONS\n"
|
||||||
|
msgstr " INGA ÅTGÄRDER\n"
|
||||||
|
|
||||||
|
#: src/print.c:124
|
||||||
|
#, c-format
|
||||||
|
msgid " $ \tgo to state %d\n"
|
||||||
|
msgstr " $ \tgå till tillstånd %d\n"
|
||||||
|
|
||||||
|
#: src/print.c:127
|
||||||
|
#, c-format
|
||||||
|
msgid " %-4s\tshift, and go to state %d\n"
|
||||||
|
msgstr " %-4s\tskifta, och gå till tillstånd %d\n"
|
||||||
|
|
||||||
|
#: src/print.c:142
|
||||||
|
#, c-format
|
||||||
|
msgid " %-4s\terror (nonassociative)\n"
|
||||||
|
msgstr " %-4s\tfel (ickeassociativ)\n"
|
||||||
|
|
||||||
|
#: src/print.c:169
|
||||||
|
#, c-format
|
||||||
|
msgid " %-4s\tgo to state %d\n"
|
||||||
|
msgstr " %-4s\tgå till tillstånd %d\n"
|
||||||
|
|
||||||
|
#: src/print.c:180
|
||||||
|
#, c-format
|
||||||
|
msgid "state %d"
|
||||||
|
msgstr "tillstånd %d"
|
||||||
|
|
||||||
|
#. rule # : LHS -> RHS
|
||||||
|
#: src/print.c:211
|
||||||
|
msgid "Grammar"
|
||||||
|
msgstr "Grammatik"
|
||||||
|
|
||||||
|
#: src/print.c:212
|
||||||
|
msgid "Number, Line, Rule"
|
||||||
|
msgstr "Nummer, Rad, Regel"
|
||||||
|
|
||||||
|
#: src/print.c:217
|
||||||
|
#, c-format
|
||||||
|
msgid " %3d %3d %s ->"
|
||||||
|
msgstr " %3d %3d %s ->"
|
||||||
|
|
||||||
|
#: src/print.c:224
|
||||||
|
msgid "empty"
|
||||||
|
msgstr "tom"
|
||||||
|
|
||||||
|
#. TERMINAL (type #) : rule #s terminal is on RHS
|
||||||
|
#: src/print.c:231
|
||||||
|
msgid "Terminals, with rules where they appear"
|
||||||
|
msgstr "Terminaler, med regler där de förekommer"
|
||||||
|
|
||||||
|
#: src/print.c:256
|
||||||
|
msgid "Nonterminals, with rules where they appear"
|
||||||
|
msgstr "Icketerminaler, med regler där de förekommer"
|
||||||
|
|
||||||
|
#: src/print.c:282
|
||||||
|
msgid " on left:"
|
||||||
|
msgstr " till vänster:"
|
||||||
|
|
||||||
|
#: src/print.c:297
|
||||||
|
msgid " on right:"
|
||||||
|
msgstr " till höger:"
|
||||||
|
|
||||||
|
#. If something has been added in the NODE_OBSTACK after
|
||||||
|
#. the declaration of the label, then we need a `\n'.
|
||||||
|
#. if (obstack_object_size (node_obstack) > node_output_size)
|
||||||
|
#. obstack_sgrow (node_obstack, "\n");
|
||||||
|
#.
|
||||||
|
#: src/print_graph.c:146
|
||||||
|
#, c-format
|
||||||
|
msgid "%-4s\terror (nonassociative)"
|
||||||
|
msgstr "%-4s\tfel (ickeassociativ)"
|
||||||
|
|
||||||
|
#.
|
||||||
|
#. if (obstack_object_size (node_obstack) > node_output_size)
|
||||||
|
#. obstack_sgrow (node_obstack, "\n");
|
||||||
|
#.
|
||||||
|
#: src/print_graph.c:161
|
||||||
|
#, c-format
|
||||||
|
msgid "$default\treduce using rule %d (%s)"
|
||||||
|
msgstr "$standard\treducera med regel %d (%s)"
|
||||||
|
|
||||||
|
#: src/reader.c:89
|
||||||
|
msgid " Skipping to next \\n"
|
||||||
|
msgstr " Hoppar över till nästa \\n"
|
||||||
|
|
||||||
|
#: src/reader.c:91
|
||||||
|
#, c-format
|
||||||
|
msgid " Skipping to next %c"
|
||||||
|
msgstr " Hoppar över till nästa %c"
|
||||||
|
|
||||||
|
#: src/reader.c:142 src/reader.c:154
|
||||||
|
msgid "invalid $ value"
|
||||||
|
msgstr "felaktigt $-värde"
|
||||||
|
|
||||||
|
#: src/reader.c:180 src/reader.c:195
|
||||||
|
msgid "unterminated string at end of file"
|
||||||
|
msgstr "oavslutad sträng vid filslut"
|
||||||
|
|
||||||
|
#: src/reader.c:183
|
||||||
|
msgid "unterminated string"
|
||||||
|
msgstr "oavslutad sträng"
|
||||||
|
|
||||||
|
#: src/reader.c:336 src/reader.c:400
|
||||||
|
#, c-format
|
||||||
|
msgid "%s is invalid"
|
||||||
|
msgstr "%s är felaktigt"
|
||||||
|
|
||||||
|
#: src/reader.c:376
|
||||||
|
#, c-format
|
||||||
|
msgid "$$ of `%s' has no declared type"
|
||||||
|
msgstr "$$ för \"%s\" har ingen deklarerad typ"
|
||||||
|
|
||||||
|
#: src/reader.c:393
|
||||||
|
#, c-format
|
||||||
|
msgid "$%d of `%s' has no declared type"
|
||||||
|
msgstr "$%d för \"%s\" har ingen deklarerad typ"
|
||||||
|
|
||||||
|
#: src/reader.c:447
|
||||||
|
msgid "unterminated `%{' definition"
|
||||||
|
msgstr "oavslutad \"%{\"-definition"
|
||||||
|
|
||||||
|
#: src/reader.c:492 src/reader.c:607 src/reader.c:657
|
||||||
|
#, c-format
|
||||||
|
msgid "Premature EOF after %s"
|
||||||
|
msgstr "Förtida filslut efter %s"
|
||||||
|
|
||||||
|
#: src/reader.c:509
|
||||||
|
#, c-format
|
||||||
|
msgid "symbol `%s' used more than once as a literal string"
|
||||||
|
msgstr "symbolen \"%s\" används mer än en gång som en bokstavlig sträng"
|
||||||
|
|
||||||
|
#: src/reader.c:512
|
||||||
|
#, c-format
|
||||||
|
msgid "symbol `%s' given more than one literal string"
|
||||||
|
msgstr "symbolen \"%s\" har fått mer än en bokstavlig sträng"
|
||||||
|
|
||||||
|
#: src/reader.c:533 src/reader.c:676
|
||||||
|
#, c-format
|
||||||
|
msgid "symbol %s redefined"
|
||||||
|
msgstr "symbolen %s omdefinierad"
|
||||||
|
|
||||||
|
#: src/reader.c:543 src/reader.c:622 src/reader.c:683 src/reader.c:1292
|
||||||
|
#, c-format
|
||||||
|
msgid "type redeclaration for %s"
|
||||||
|
msgstr "typen omdeklarerad för %s"
|
||||||
|
|
||||||
|
#: src/reader.c:552
|
||||||
|
#, c-format
|
||||||
|
msgid "`%s' is invalid in %s"
|
||||||
|
msgstr "\"%s\" är felaktig i %s"
|
||||||
|
|
||||||
|
#: src/reader.c:570 src/reader.c:735
|
||||||
|
#, c-format
|
||||||
|
msgid "multiple %s declarations"
|
||||||
|
msgstr "flera %s-deklarationer"
|
||||||
|
|
||||||
|
#: src/reader.c:572 src/reader.c:914 src/reader.c:939 src/reader.c:1270
|
||||||
|
#, c-format
|
||||||
|
msgid "invalid %s declaration"
|
||||||
|
msgstr "felaktig %s-deklaration"
|
||||||
|
|
||||||
|
#: src/reader.c:592
|
||||||
|
msgid "%type declaration has no <typename>"
|
||||||
|
msgstr "%type-deklaration har inget <typnamn>"
|
||||||
|
|
||||||
|
#: src/reader.c:627
|
||||||
|
#, c-format
|
||||||
|
msgid "invalid %%type declaration due to item: %s"
|
||||||
|
msgstr "felaktig %%type-deklaration på grund av objekt: %s"
|
||||||
|
|
||||||
|
#: src/reader.c:672
|
||||||
|
#, c-format
|
||||||
|
msgid "redefining precedence of %s"
|
||||||
|
msgstr "omdefinition av precedens för %s"
|
||||||
|
|
||||||
|
#: src/reader.c:695
|
||||||
|
#, c-format
|
||||||
|
msgid "invalid text (%s) - number should be after identifier"
|
||||||
|
msgstr "felaktig text (%s) - tal skulle följa efter identifierare"
|
||||||
|
|
||||||
|
#: src/reader.c:705
|
||||||
|
#, c-format
|
||||||
|
msgid "unexpected item: %s"
|
||||||
|
msgstr "oväntat objekt: %s"
|
||||||
|
|
||||||
|
#: src/reader.c:778 src/reader.c:1110 src/reader.c:1181
|
||||||
|
#, c-format
|
||||||
|
msgid "unmatched %s"
|
||||||
|
msgstr "ensam %s"
|
||||||
|
|
||||||
|
#: src/reader.c:810
|
||||||
|
#, c-format
|
||||||
|
msgid "argument of %%expect is not an integer"
|
||||||
|
msgstr "argument till %%expect är inte ett heltal"
|
||||||
|
|
||||||
|
#: src/reader.c:856
|
||||||
|
#, c-format
|
||||||
|
msgid "unrecognized item %s, expected an identifier"
|
||||||
|
msgstr "oväntat objekt %s, förväntade en identifierare"
|
||||||
|
|
||||||
|
#: src/reader.c:878
|
||||||
|
#, c-format
|
||||||
|
msgid "expected string constant instead of %s"
|
||||||
|
msgstr "förväntade strängkonstant istället för %s"
|
||||||
|
|
||||||
|
#: src/reader.c:1026
|
||||||
|
#, c-format
|
||||||
|
msgid "unrecognized: %s"
|
||||||
|
msgstr "okänt: %s"
|
||||||
|
|
||||||
|
#: src/reader.c:1031
|
||||||
|
msgid "no input grammar"
|
||||||
|
msgstr "ingen ingrammatik"
|
||||||
|
|
||||||
|
#: src/reader.c:1036
|
||||||
|
#, c-format
|
||||||
|
msgid "unknown character: %s"
|
||||||
|
msgstr "okänt tecken: %s"
|
||||||
|
|
||||||
|
#: src/reader.c:1204
|
||||||
|
#, c-format
|
||||||
|
msgid "unterminated %guard clause"
|
||||||
|
msgstr "oavlutad %guard-sats"
|
||||||
|
|
||||||
|
#: src/reader.c:1357
|
||||||
|
msgid "ill-formed rule: initial symbol not followed by colon"
|
||||||
|
msgstr "felskriven regel: första symbolen följs inte av ett kolon"
|
||||||
|
|
||||||
|
#: src/reader.c:1364
|
||||||
|
msgid "grammar starts with vertical bar"
|
||||||
|
msgstr "grammatiken startar med ett vertikalt streck"
|
||||||
|
|
||||||
|
#: src/reader.c:1392
|
||||||
|
#, c-format
|
||||||
|
msgid "rule given for %s, which is a token"
|
||||||
|
msgstr "regel given för %s, som är ett element"
|
||||||
|
|
||||||
|
#: src/reader.c:1492
|
||||||
|
msgid "two @prec's in a row"
|
||||||
|
msgstr "två @prec i rad"
|
||||||
|
|
||||||
|
#: src/reader.c:1500
|
||||||
|
#, c-format
|
||||||
|
msgid "%%guard present but %%semantic_parser not specified"
|
||||||
|
msgstr "%%guard finns men %%semantic_parser är inte angiven"
|
||||||
|
|
||||||
|
#: src/reader.c:1509
|
||||||
|
msgid "two actions at end of one rule"
|
||||||
|
msgstr "två åtgärder vid slutet av en regel"
|
||||||
|
|
||||||
|
#: src/reader.c:1523
|
||||||
|
#, c-format
|
||||||
|
msgid "type clash (`%s' `%s') on default action"
|
||||||
|
msgstr "typkonflikt (\"%s\" \"%s\") för standardåtgärd"
|
||||||
|
|
||||||
|
#: src/reader.c:1529
|
||||||
|
msgid "empty rule for typed nonterminal, and no action"
|
||||||
|
msgstr "tom regel för typad icketerminal, och ingen åtgärd"
|
||||||
|
|
||||||
|
#: src/reader.c:1573
|
||||||
|
#, c-format
|
||||||
|
msgid "invalid input: %s"
|
||||||
|
msgstr "felaktig indata: %s"
|
||||||
|
|
||||||
|
#: src/reader.c:1581
|
||||||
|
#, c-format
|
||||||
|
msgid "too many symbols (tokens plus nonterminals); maximum %d"
|
||||||
|
msgstr "för många symboler (element plus icketerminaler); max %d"
|
||||||
|
|
||||||
|
#: src/reader.c:1584
|
||||||
|
msgid "no rules in the input grammar"
|
||||||
|
msgstr "inga regler i ingrammatiken"
|
||||||
|
|
||||||
|
#: src/reader.c:1608
|
||||||
|
#, c-format
|
||||||
|
msgid "symbol %s is used, but is not defined as a token and has no rules"
|
||||||
|
msgstr ""
|
||||||
|
"symbolen %s används, men är inte definierad som ett element och har inga "
|
||||||
|
"regler"
|
||||||
|
|
||||||
|
#: src/reader.c:1743
|
||||||
|
#, c-format
|
||||||
|
msgid "tokens %s and %s both assigned number %d"
|
||||||
|
msgstr "elementen %s och %s har båda fått nummer %d"
|
||||||
|
|
||||||
|
#: src/reader.c:1796
|
||||||
|
#, c-format
|
||||||
|
msgid "conflicting precedences for %s and %s"
|
||||||
|
msgstr "motstridiga precedenser mellan %s och %s"
|
||||||
|
|
||||||
|
#: src/reader.c:1808
|
||||||
|
#, c-format
|
||||||
|
msgid "conflicting assoc values for %s and %s"
|
||||||
|
msgstr "motstridiga assoc-värden mellan %s och %s"
|
||||||
|
|
||||||
|
#: src/reader.c:1847
|
||||||
|
#, c-format
|
||||||
|
msgid "the start symbol %s is undefined"
|
||||||
|
msgstr "startsymbolen %s är odefinierad"
|
||||||
|
|
||||||
|
#: src/reader.c:1849
|
||||||
|
#, c-format
|
||||||
|
msgid "the start symbol %s is a token"
|
||||||
|
msgstr "startsymbolen %s är ett element"
|
||||||
|
|
||||||
|
#: src/reduce.c:409
|
||||||
|
msgid "Useless nonterminals:"
|
||||||
|
msgstr "Oanvändbara icketerminaler:"
|
||||||
|
|
||||||
|
#: src/reduce.c:422
|
||||||
|
msgid "Terminals which are not used:"
|
||||||
|
msgstr "Terminaler som inte används:"
|
||||||
|
|
||||||
|
#: src/reduce.c:433
|
||||||
|
msgid "Useless rules:"
|
||||||
|
msgstr "Oanvändbara regler:"
|
||||||
|
|
||||||
|
#: src/reduce.c:503
|
||||||
|
#, fuzzy, c-format
|
||||||
|
msgid "%d rule never reduced\n"
|
||||||
|
msgid_plural "%d rules never reduced\n"
|
||||||
|
msgstr[0] "%d regler reduceras aldrig\n"
|
||||||
|
|
||||||
|
# Jag har anmält att det är fel att anta att "s" är en universell pluraländelse.
|
||||||
|
# Jag föreslog också att de använder ngettext istället.
|
||||||
|
# "Vad göras skall är redan gjort."
|
||||||
|
#: src/reduce.c:511
|
||||||
|
#, fuzzy, c-format
|
||||||
|
msgid "%d useless nonterminal"
|
||||||
|
msgid_plural "%d useless nonterminals"
|
||||||
|
msgstr[0] "%d oanvändbara icketerminaler%.0s"
|
||||||
|
|
||||||
|
#: src/reduce.c:517
|
||||||
|
msgid " and "
|
||||||
|
msgstr " och "
|
||||||
|
|
||||||
|
#: src/reduce.c:520
|
||||||
|
#, fuzzy, c-format
|
||||||
|
msgid "%d useless rule"
|
||||||
|
msgid_plural "%d useless rules"
|
||||||
|
msgstr[0] "%d oanvändbara regler%.0s"
|
||||||
|
|
||||||
|
#: src/reduce.c:551
|
||||||
|
#, c-format
|
||||||
|
msgid "Start symbol %s does not derive any sentence"
|
||||||
|
msgstr "Startsymbolen %s genererar inga meningar"
|
||||||
|
|
||||||
|
#: lib/getopt.c:694
|
||||||
|
#, c-format
|
||||||
|
msgid "%s: option `%s' is ambiguous\n"
|
||||||
|
msgstr "%s: flaggan \"%s\" är tvetydig\n"
|
||||||
|
|
||||||
|
#: lib/getopt.c:719
|
||||||
|
#, c-format
|
||||||
|
msgid "%s: option `--%s' doesn't allow an argument\n"
|
||||||
|
msgstr "%s: flaggan \"--%s\" tar inget argument\n"
|
||||||
|
|
||||||
|
#: lib/getopt.c:724
|
||||||
|
#, c-format
|
||||||
|
msgid "%s: option `%c%s' doesn't allow an argument\n"
|
||||||
|
msgstr "%s: flaggan \"%c%s\" tar inget argument\n"
|
||||||
|
|
||||||
|
#: lib/getopt.c:742 lib/getopt.c:915
|
||||||
|
#, c-format
|
||||||
|
msgid "%s: option `%s' requires an argument\n"
|
||||||
|
msgstr "%s: flaggan \"%s\" behöver ett argument\n"
|
||||||
|
|
||||||
|
#. --option
|
||||||
|
#: lib/getopt.c:771
|
||||||
|
#, c-format
|
||||||
|
msgid "%s: unrecognized option `--%s'\n"
|
||||||
|
msgstr "%s: okänd flagga \"--%s\"\n"
|
||||||
|
|
||||||
|
#. +option or -option
|
||||||
|
#: lib/getopt.c:775
|
||||||
|
#, c-format
|
||||||
|
msgid "%s: unrecognized option `%c%s'\n"
|
||||||
|
msgstr "%s: okänd flagga \"%c%s\"\n"
|
||||||
|
|
||||||
|
#. 1003.2 specifies the format of this message.
|
||||||
|
#: lib/getopt.c:801
|
||||||
|
#, c-format
|
||||||
|
msgid "%s: illegal option -- %c\n"
|
||||||
|
msgstr "%s: otillåten flagga -- %c\n"
|
||||||
|
|
||||||
|
#: lib/getopt.c:804
|
||||||
|
#, c-format
|
||||||
|
msgid "%s: invalid option -- %c\n"
|
||||||
|
msgstr "%s: ogiltig flagga --%c\n"
|
||||||
|
|
||||||
|
#. 1003.2 specifies the format of this message.
|
||||||
|
#: lib/getopt.c:834 lib/getopt.c:964
|
||||||
|
#, c-format
|
||||||
|
msgid "%s: option requires an argument -- %c\n"
|
||||||
|
msgstr "%s: flaggan behöver ett argument -- %c\n"
|
||||||
|
|
||||||
|
#: lib/getopt.c:881
|
||||||
|
#, c-format
|
||||||
|
msgid "%s: option `-W %s' is ambiguous\n"
|
||||||
|
msgstr "%s: flaggan \"-W %s\" är tvetydig\n"
|
||||||
|
|
||||||
|
#: lib/getopt.c:899
|
||||||
|
#, c-format
|
||||||
|
msgid "%s: option `-W %s' doesn't allow an argument\n"
|
||||||
|
msgstr "%s: flaggan \"-W %s\" tar inget argument\n"
|
||||||
|
|
||||||
|
#. If XALLOC_FAIL_FUNC is NULL, or does return, display this message
|
||||||
|
#. before exiting when memory is exhausted. Goes through gettext.
|
||||||
|
#: lib/obstack.c:494 lib/obstack.c:497 lib/xmalloc.c:66
|
||||||
|
msgid "memory exhausted"
|
||||||
|
msgstr "minnet slut"
|
||||||
|
|
||||||
|
# När vi går över till Unicode mer allmänt kanske vi bör översätta båda dessa
|
||||||
|
# med U+201D (RIGHT DOUBLE QUOTATION MARK) på svenska. Eller?
|
||||||
|
#
|
||||||
|
#. Get translations for open and closing quotation marks.
|
||||||
|
#.
|
||||||
|
#. The message catalog should translate "`" to a left
|
||||||
|
#. quotation mark suitable for the locale, and similarly for
|
||||||
|
#. "'". If the catalog has no translation,
|
||||||
|
#. locale_quoting_style quotes `like this', and
|
||||||
|
#. clocale_quoting_style quotes "like this".
|
||||||
|
#.
|
||||||
|
#. For example, an American English Unicode locale should
|
||||||
|
#. translate "`" to U+201C (LEFT DOUBLE QUOTATION MARK), and
|
||||||
|
#. should translate "'" to U+201D (RIGHT DOUBLE QUOTATION
|
||||||
|
#. MARK). A British English Unicode locale should instead
|
||||||
|
#. translate these to U+2018 (LEFT SINGLE QUOTATION MARK) and
|
||||||
|
#. U+2019 (RIGHT SINGLE QUOTATION MARK), respectively.
|
||||||
|
#: lib/quotearg.c:274
|
||||||
|
msgid "`"
|
||||||
|
msgstr "\""
|
||||||
|
|
||||||
|
#: lib/quotearg.c:275
|
||||||
|
msgid "'"
|
||||||
|
msgstr "\""
|
||||||
|
|
||||||
|
#~ msgid "%s: internal error: %s\n"
|
||||||
|
#~ msgstr "%s: internt fel: %s\n"
|
||||||
|
|
||||||
|
#~ msgid ""
|
||||||
|
#~ "Variables\n"
|
||||||
|
#~ "---------\n"
|
||||||
|
#~ "\n"
|
||||||
|
#~ msgstr ""
|
||||||
|
#~ "Variabler\n"
|
||||||
|
#~ "---------\n"
|
||||||
|
#~ "\n"
|
||||||
|
|
||||||
|
#~ msgid "Value Sprec Sassoc Tag\n"
|
||||||
|
#~ msgstr "Värde Sprec Sassoc Tagg\n"
|
||||||
|
|
||||||
|
#~ msgid ""
|
||||||
|
#~ "Rules\n"
|
||||||
|
#~ "-----\n"
|
||||||
|
#~ "\n"
|
||||||
|
#~ msgstr ""
|
||||||
|
#~ "Regler\n"
|
||||||
|
#~ "------\n"
|
||||||
|
#~ "\n"
|
||||||
|
|
||||||
|
#~ msgid ""
|
||||||
|
#~ "Rules interpreted\n"
|
||||||
|
#~ "-----------------\n"
|
||||||
|
#~ "\n"
|
||||||
|
#~ msgstr ""
|
||||||
|
#~ "Tolkade regler\n"
|
||||||
|
#~ "--------------\n"
|
||||||
|
#~ "\n"
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/* Generate the nondeterministic finite state machine for bison,
|
/* Generate the nondeterministic finite state machine for bison,
|
||||||
Copyright 1984, 1986, 1989, 2000 Free Software Foundation, Inc.
|
Copyright 1984, 1986, 1989, 2000, 2001 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of Bison, the GNU Compiler Compiler.
|
This file is part of Bison, the GNU Compiler Compiler.
|
||||||
|
|
||||||
@@ -23,12 +23,14 @@
|
|||||||
The entry point is generate_states. */
|
The entry point is generate_states. */
|
||||||
|
|
||||||
#include "system.h"
|
#include "system.h"
|
||||||
|
#include "getargs.h"
|
||||||
|
#include "reader.h"
|
||||||
#include "gram.h"
|
#include "gram.h"
|
||||||
#include "state.h"
|
#include "state.h"
|
||||||
#include "complain.h"
|
#include "complain.h"
|
||||||
#include "closure.h"
|
#include "closure.h"
|
||||||
#include "LR0.h"
|
#include "LR0.h"
|
||||||
|
#include "reduce.h"
|
||||||
|
|
||||||
int nstates;
|
int nstates;
|
||||||
int final_state;
|
int final_state;
|
||||||
@@ -48,7 +50,7 @@ static short *redset = NULL;
|
|||||||
static short *shiftset = NULL;
|
static short *shiftset = NULL;
|
||||||
|
|
||||||
static short **kernel_base = NULL;
|
static short **kernel_base = NULL;
|
||||||
static short **kernel_end = NULL;
|
static int *kernel_size = NULL;
|
||||||
static short *kernel_items = NULL;
|
static short *kernel_items = NULL;
|
||||||
|
|
||||||
/* hash table for states, to recognize equivalent ones. */
|
/* hash table for states, to recognize equivalent ones. */
|
||||||
@@ -60,26 +62,21 @@ static core **state_table = NULL;
|
|||||||
static void
|
static void
|
||||||
allocate_itemsets (void)
|
allocate_itemsets (void)
|
||||||
{
|
{
|
||||||
short *itemp = NULL;
|
|
||||||
int symbol;
|
|
||||||
int i;
|
int i;
|
||||||
int count;
|
|
||||||
short *symbol_count = NULL;
|
|
||||||
|
|
||||||
count = 0;
|
/* Count the number of occurrences of all the symbols in RITEMS.
|
||||||
symbol_count = XCALLOC (short, nsyms);
|
Note that useless productions (hence useless nonterminals) are
|
||||||
|
browsed too, hence we need to allocate room for _all_ the
|
||||||
|
symbols. */
|
||||||
|
int count = 0;
|
||||||
|
short *symbol_count = XCALLOC (short, nsyms + nuseless_nonterminals);
|
||||||
|
|
||||||
itemp = ritem;
|
for (i = 0; ritem[i]; ++i)
|
||||||
symbol = *itemp++;
|
if (ritem[i] > 0)
|
||||||
while (symbol)
|
{
|
||||||
{
|
count++;
|
||||||
if (symbol > 0)
|
symbol_count[ritem[i]]++;
|
||||||
{
|
}
|
||||||
count++;
|
|
||||||
symbol_count[symbol]++;
|
|
||||||
}
|
|
||||||
symbol = *itemp++;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* See comments before new_itemsets. All the vectors of items
|
/* See comments before new_itemsets. All the vectors of items
|
||||||
live inside KERNEL_ITEMS. The number of active items after
|
live inside KERNEL_ITEMS. The number of active items after
|
||||||
@@ -98,8 +95,8 @@ allocate_itemsets (void)
|
|||||||
count += symbol_count[i];
|
count += symbol_count[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
shift_symbol = symbol_count;
|
free (symbol_count);
|
||||||
kernel_end = XCALLOC (short *, nsyms);
|
kernel_size = XCALLOC (int, nsyms);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -117,13 +114,13 @@ allocate_storage (void)
|
|||||||
static void
|
static void
|
||||||
free_storage (void)
|
free_storage (void)
|
||||||
{
|
{
|
||||||
XFREE (shift_symbol);
|
free (shift_symbol);
|
||||||
XFREE (redset);
|
free (redset);
|
||||||
XFREE (shiftset);
|
free (shiftset);
|
||||||
XFREE (kernel_base);
|
free (kernel_base);
|
||||||
XFREE (kernel_end);
|
free (kernel_size);
|
||||||
XFREE (kernel_items);
|
XFREE (kernel_items);
|
||||||
XFREE (state_table);
|
free (state_table);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -137,50 +134,39 @@ free_storage (void)
|
|||||||
| shift_symbol is set to a vector of the symbols that can be |
|
| shift_symbol is set to a vector of the symbols that can be |
|
||||||
| shifted. For each symbol in the grammar, kernel_base[symbol] |
|
| shifted. For each symbol in the grammar, kernel_base[symbol] |
|
||||||
| points to a vector of item numbers activated if that symbol is |
|
| points to a vector of item numbers activated if that symbol is |
|
||||||
| shifted, and kernel_end[symbol] points after the end of that |
|
| shifted, and kernel_size[symbol] is their numbers. |
|
||||||
| vector. |
|
|
||||||
`----------------------------------------------------------------*/
|
`----------------------------------------------------------------*/
|
||||||
|
|
||||||
static void
|
static void
|
||||||
new_itemsets (void)
|
new_itemsets (void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
int shiftcount;
|
|
||||||
short *isp;
|
|
||||||
short *ksp;
|
|
||||||
int symbol;
|
|
||||||
|
|
||||||
#if TRACE
|
if (trace_flag)
|
||||||
fprintf (stderr, "Entering new_itemsets\n");
|
fprintf (stderr, "Entering new_itemsets, state = %d\n",
|
||||||
#endif
|
this_state->number);
|
||||||
|
|
||||||
for (i = 0; i < nsyms; i++)
|
for (i = 0; i < nsyms; i++)
|
||||||
kernel_end[i] = NULL;
|
kernel_size[i] = 0;
|
||||||
|
|
||||||
shiftcount = 0;
|
shift_symbol = XCALLOC (short, nsyms);
|
||||||
|
nshifts = 0;
|
||||||
|
|
||||||
isp = itemset;
|
for (i = 0; i < nitemset; ++i)
|
||||||
|
|
||||||
while (isp < itemsetend)
|
|
||||||
{
|
{
|
||||||
i = *isp++;
|
int symbol = ritem[itemset[i]];
|
||||||
symbol = ritem[i];
|
|
||||||
if (symbol > 0)
|
if (symbol > 0)
|
||||||
{
|
{
|
||||||
ksp = kernel_end[symbol];
|
if (!kernel_size[symbol])
|
||||||
|
|
||||||
if (!ksp)
|
|
||||||
{
|
{
|
||||||
shift_symbol[shiftcount++] = symbol;
|
shift_symbol[nshifts] = symbol;
|
||||||
ksp = kernel_base[symbol];
|
nshifts++;
|
||||||
}
|
}
|
||||||
|
|
||||||
*ksp++ = i + 1;
|
kernel_base[symbol][kernel_size[symbol]] = itemset[i] + 1;
|
||||||
kernel_end[symbol] = ksp;
|
kernel_size[symbol]++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
nshifts = shiftcount;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -193,36 +179,24 @@ new_itemsets (void)
|
|||||||
static core *
|
static core *
|
||||||
new_state (int symbol)
|
new_state (int symbol)
|
||||||
{
|
{
|
||||||
int n;
|
|
||||||
core *p;
|
core *p;
|
||||||
short *isp1;
|
|
||||||
short *isp2;
|
|
||||||
short *iend;
|
|
||||||
|
|
||||||
#if TRACE
|
if (trace_flag)
|
||||||
fprintf (stderr, "Entering new_state, symbol = %d\n", symbol);
|
fprintf (stderr, "Entering new_state, state = %d, symbol = %d (%s)\n",
|
||||||
#endif
|
this_state->number, symbol, tags[symbol]);
|
||||||
|
|
||||||
if (nstates >= MAXSHORT)
|
if (nstates >= MAXSHORT)
|
||||||
fatal (_("too many states (max %d)"), MAXSHORT);
|
fatal (_("too many states (max %d)"), MAXSHORT);
|
||||||
|
|
||||||
isp1 = kernel_base[symbol];
|
p = CORE_ALLOC (kernel_size[symbol]);
|
||||||
iend = kernel_end[symbol];
|
|
||||||
n = iend - isp1;
|
|
||||||
|
|
||||||
p =
|
|
||||||
(core *) xcalloc ((unsigned) (sizeof (core) + (n - 1) * sizeof (short)), 1);
|
|
||||||
p->accessing_symbol = symbol;
|
p->accessing_symbol = symbol;
|
||||||
p->number = nstates;
|
p->number = nstates;
|
||||||
p->nitems = n;
|
p->nitems = kernel_size[symbol];
|
||||||
|
|
||||||
isp2 = p->items;
|
shortcpy (p->items, kernel_base[symbol], kernel_size[symbol]);
|
||||||
while (isp1 < iend)
|
|
||||||
*isp2++ = *isp1++;
|
|
||||||
|
|
||||||
last_state->next = p;
|
last_state->next = p;
|
||||||
last_state = p;
|
last_state = p;
|
||||||
|
|
||||||
nstates++;
|
nstates++;
|
||||||
|
|
||||||
return p;
|
return p;
|
||||||
@@ -232,54 +206,39 @@ new_state (int symbol)
|
|||||||
/*--------------------------------------------------------------.
|
/*--------------------------------------------------------------.
|
||||||
| Find the state number for the state we would get to (from the |
|
| Find the state number for the state we would get to (from the |
|
||||||
| current state) by shifting symbol. Create a new state if no |
|
| current state) by shifting symbol. Create a new state if no |
|
||||||
| equivalent one exists already. Used by append_states. |
|
| equivalent one exists already. Used by append_states. |
|
||||||
`--------------------------------------------------------------*/
|
`--------------------------------------------------------------*/
|
||||||
|
|
||||||
static int
|
static int
|
||||||
get_state (int symbol)
|
get_state (int symbol)
|
||||||
{
|
{
|
||||||
int key;
|
int key;
|
||||||
short *isp1;
|
int i;
|
||||||
short *isp2;
|
|
||||||
short *iend;
|
|
||||||
core *sp;
|
core *sp;
|
||||||
int found;
|
|
||||||
|
|
||||||
int n;
|
if (trace_flag)
|
||||||
|
fprintf (stderr, "Entering get_state, state = %d, symbol = %d (%s)\n",
|
||||||
|
this_state->number, symbol, tags[symbol]);
|
||||||
|
|
||||||
#if TRACE
|
/* Add up the target state's active item numbers to get a hash key.
|
||||||
fprintf (stderr, "Entering get_state, symbol = %d\n", symbol);
|
*/
|
||||||
#endif
|
|
||||||
|
|
||||||
isp1 = kernel_base[symbol];
|
|
||||||
iend = kernel_end[symbol];
|
|
||||||
n = iend - isp1;
|
|
||||||
|
|
||||||
/* add up the target state's active item numbers to get a hash key */
|
|
||||||
key = 0;
|
key = 0;
|
||||||
while (isp1 < iend)
|
for (i = 0; i < kernel_size[symbol]; ++i)
|
||||||
key += *isp1++;
|
key += kernel_base[symbol][i];
|
||||||
|
|
||||||
key = key % STATE_TABLE_SIZE;
|
key = key % STATE_TABLE_SIZE;
|
||||||
|
|
||||||
sp = state_table[key];
|
sp = state_table[key];
|
||||||
|
|
||||||
if (sp)
|
if (sp)
|
||||||
{
|
{
|
||||||
found = 0;
|
int found = 0;
|
||||||
while (!found)
|
while (!found)
|
||||||
{
|
{
|
||||||
if (sp->nitems == n)
|
if (sp->nitems == kernel_size[symbol])
|
||||||
{
|
{
|
||||||
found = 1;
|
found = 1;
|
||||||
isp1 = kernel_base[symbol];
|
for (i = 0; i < kernel_size[symbol]; ++i)
|
||||||
isp2 = sp->items;
|
if (kernel_base[symbol][i] != sp->items[i])
|
||||||
|
found = 0;
|
||||||
while (found && isp1 < iend)
|
|
||||||
{
|
|
||||||
if (*isp1++ != *isp2++)
|
|
||||||
found = 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!found)
|
if (!found)
|
||||||
@@ -301,6 +260,9 @@ get_state (int symbol)
|
|||||||
state_table[key] = sp = new_state (symbol);
|
state_table[key] = sp = new_state (symbol);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (trace_flag)
|
||||||
|
fprintf (stderr, "Exiting get_state => %d\n", sp->number);
|
||||||
|
|
||||||
return sp->number;
|
return sp->number;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -318,9 +280,9 @@ append_states (void)
|
|||||||
int j;
|
int j;
|
||||||
int symbol;
|
int symbol;
|
||||||
|
|
||||||
#if TRACE
|
if (trace_flag)
|
||||||
fprintf (stderr, "Entering append_states\n");
|
fprintf (stderr, "Entering append_states, state = %d\n",
|
||||||
#endif
|
this_state->number);
|
||||||
|
|
||||||
/* first sort shift_symbol into increasing order */
|
/* first sort shift_symbol into increasing order */
|
||||||
|
|
||||||
@@ -337,55 +299,36 @@ append_states (void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < nshifts; i++)
|
for (i = 0; i < nshifts; i++)
|
||||||
{
|
shiftset[i] = get_state (shift_symbol[i]);
|
||||||
symbol = shift_symbol[i];
|
|
||||||
shiftset[i] = get_state (symbol);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
new_states (void)
|
new_states (void)
|
||||||
{
|
{
|
||||||
core *p;
|
first_state = last_state = this_state = CORE_ALLOC (0);
|
||||||
|
|
||||||
p = (core *) xcalloc ((unsigned) (sizeof (core) - sizeof (short)), 1);
|
|
||||||
first_state = last_state = this_state = p;
|
|
||||||
nstates = 1;
|
nstates = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------.
|
||||||
|
| Save the NSHIFTS of SHIFTSET into the current linked list. |
|
||||||
|
`------------------------------------------------------------*/
|
||||||
|
|
||||||
static void
|
static void
|
||||||
save_shifts (void)
|
save_shifts (void)
|
||||||
{
|
{
|
||||||
shifts *p;
|
shifts *p = shifts_new (nshifts);
|
||||||
short *sp1;
|
|
||||||
short *sp2;
|
|
||||||
short *send;
|
|
||||||
|
|
||||||
p = (shifts *) xcalloc ((unsigned) (sizeof (shifts) +
|
|
||||||
(nshifts - 1) * sizeof (short)), 1);
|
|
||||||
|
|
||||||
p->number = this_state->number;
|
p->number = this_state->number;
|
||||||
p->nshifts = nshifts;
|
|
||||||
|
|
||||||
sp1 = shiftset;
|
shortcpy (p->shifts, shiftset, nshifts);
|
||||||
sp2 = p->shifts;
|
|
||||||
send = shiftset + nshifts;
|
|
||||||
|
|
||||||
while (sp1 < send)
|
|
||||||
*sp2++ = *sp1++;
|
|
||||||
|
|
||||||
if (last_shift)
|
if (last_shift)
|
||||||
{
|
last_shift->next = p;
|
||||||
last_shift->next = p;
|
|
||||||
last_shift = p;
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
first_shift = p;
|
||||||
first_shift = p;
|
last_shift = p;
|
||||||
last_shift = p;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -400,7 +343,7 @@ insert_start_shift (void)
|
|||||||
core *statep;
|
core *statep;
|
||||||
shifts *sp;
|
shifts *sp;
|
||||||
|
|
||||||
statep = (core *) xcalloc ((unsigned) (sizeof (core) - sizeof (short)), 1);
|
statep = CORE_ALLOC (0);
|
||||||
statep->number = nstates;
|
statep->number = nstates;
|
||||||
statep->accessing_symbol = start_symbol;
|
statep->accessing_symbol = start_symbol;
|
||||||
|
|
||||||
@@ -408,9 +351,8 @@ insert_start_shift (void)
|
|||||||
last_state = statep;
|
last_state = statep;
|
||||||
|
|
||||||
/* Make a shift from this state to (what will be) the final state. */
|
/* Make a shift from this state to (what will be) the final state. */
|
||||||
sp = XCALLOC (shifts, 1);
|
sp = shifts_new (1);
|
||||||
sp->number = nstates++;
|
sp->number = nstates++;
|
||||||
sp->nshifts = 1;
|
|
||||||
sp->shifts[0] = nstates;
|
sp->shifts[0] = nstates;
|
||||||
|
|
||||||
last_shift->next = sp;
|
last_shift->next = sp;
|
||||||
@@ -429,135 +371,18 @@ insert_start_shift (void)
|
|||||||
static void
|
static void
|
||||||
augment_automaton (void)
|
augment_automaton (void)
|
||||||
{
|
{
|
||||||
int i;
|
|
||||||
int k;
|
|
||||||
core *statep;
|
core *statep;
|
||||||
shifts *sp;
|
shifts *sp;
|
||||||
shifts *sp2;
|
|
||||||
shifts *sp1 = NULL;
|
shifts *sp1 = NULL;
|
||||||
|
|
||||||
sp = first_shift;
|
sp = first_shift;
|
||||||
|
|
||||||
if (sp)
|
if (!sp->nshifts)
|
||||||
{
|
{
|
||||||
if (sp->number == 0)
|
/* There are no shifts for any state. Make one shift, from the
|
||||||
{
|
initial state to the next-to-final state. */
|
||||||
k = sp->nshifts;
|
|
||||||
statep = first_state->next;
|
|
||||||
|
|
||||||
/* The states reached by shifts from first_state are numbered 1...K.
|
sp = shifts_new (1);
|
||||||
Look for one reached by start_symbol. */
|
|
||||||
while (statep->accessing_symbol < start_symbol
|
|
||||||
&& statep->number < k)
|
|
||||||
statep = statep->next;
|
|
||||||
|
|
||||||
if (statep->accessing_symbol == start_symbol)
|
|
||||||
{
|
|
||||||
/* We already have a next-to-final state.
|
|
||||||
Make sure it has a shift to what will be the final state. */
|
|
||||||
k = statep->number;
|
|
||||||
|
|
||||||
while (sp && sp->number < k)
|
|
||||||
{
|
|
||||||
sp1 = sp;
|
|
||||||
sp = sp->next;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sp && sp->number == k)
|
|
||||||
{
|
|
||||||
sp2 = (shifts *) xcalloc ((unsigned) (sizeof (shifts)
|
|
||||||
+
|
|
||||||
sp->nshifts *
|
|
||||||
sizeof (short)), 1);
|
|
||||||
sp2->number = k;
|
|
||||||
sp2->nshifts = sp->nshifts + 1;
|
|
||||||
sp2->shifts[0] = nstates;
|
|
||||||
for (i = sp->nshifts; i > 0; i--)
|
|
||||||
sp2->shifts[i] = sp->shifts[i - 1];
|
|
||||||
|
|
||||||
/* Patch sp2 into the chain of shifts in place of sp,
|
|
||||||
following sp1. */
|
|
||||||
sp2->next = sp->next;
|
|
||||||
sp1->next = sp2;
|
|
||||||
if (sp == last_shift)
|
|
||||||
last_shift = sp2;
|
|
||||||
XFREE (sp);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
sp2 = XCALLOC (shifts, 1);
|
|
||||||
sp2->number = k;
|
|
||||||
sp2->nshifts = 1;
|
|
||||||
sp2->shifts[0] = nstates;
|
|
||||||
|
|
||||||
/* Patch sp2 into the chain of shifts between sp1 and sp. */
|
|
||||||
sp2->next = sp;
|
|
||||||
sp1->next = sp2;
|
|
||||||
if (sp == 0)
|
|
||||||
last_shift = sp2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* There is no next-to-final state as yet. */
|
|
||||||
/* Add one more shift in first_shift,
|
|
||||||
going to the next-to-final state (yet to be made). */
|
|
||||||
sp = first_shift;
|
|
||||||
|
|
||||||
sp2 = (shifts *) xcalloc (sizeof (shifts)
|
|
||||||
+ sp->nshifts * sizeof (short), 1);
|
|
||||||
sp2->nshifts = sp->nshifts + 1;
|
|
||||||
|
|
||||||
/* Stick this shift into the vector at the proper place. */
|
|
||||||
statep = first_state->next;
|
|
||||||
for (k = 0, i = 0; i < sp->nshifts; k++, i++)
|
|
||||||
{
|
|
||||||
if (statep->accessing_symbol > start_symbol && i == k)
|
|
||||||
sp2->shifts[k++] = nstates;
|
|
||||||
sp2->shifts[k] = sp->shifts[i];
|
|
||||||
statep = statep->next;
|
|
||||||
}
|
|
||||||
if (i == k)
|
|
||||||
sp2->shifts[k++] = nstates;
|
|
||||||
|
|
||||||
/* Patch sp2 into the chain of shifts
|
|
||||||
in place of sp, at the beginning. */
|
|
||||||
sp2->next = sp->next;
|
|
||||||
first_shift = sp2;
|
|
||||||
if (last_shift == sp)
|
|
||||||
last_shift = sp2;
|
|
||||||
|
|
||||||
XFREE (sp);
|
|
||||||
|
|
||||||
/* Create the next-to-final state, with shift to
|
|
||||||
what will be the final state. */
|
|
||||||
insert_start_shift ();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* The initial state didn't even have any shifts.
|
|
||||||
Give it one shift, to the next-to-final state. */
|
|
||||||
sp = XCALLOC (shifts, 1);
|
|
||||||
sp->nshifts = 1;
|
|
||||||
sp->shifts[0] = nstates;
|
|
||||||
|
|
||||||
/* Patch sp into the chain of shifts at the beginning. */
|
|
||||||
sp->next = first_shift;
|
|
||||||
first_shift = sp;
|
|
||||||
|
|
||||||
/* Create the next-to-final state, with shift to
|
|
||||||
what will be the final state. */
|
|
||||||
insert_start_shift ();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* There are no shifts for any state.
|
|
||||||
Make one shift, from the initial state to the next-to-final state. */
|
|
||||||
|
|
||||||
sp = XCALLOC (shifts, 1);
|
|
||||||
sp->nshifts = 1;
|
|
||||||
sp->shifts[0] = nstates;
|
sp->shifts[0] = nstates;
|
||||||
|
|
||||||
/* Initialize the chain of shifts with sp. */
|
/* Initialize the chain of shifts with sp. */
|
||||||
@@ -568,19 +393,121 @@ augment_automaton (void)
|
|||||||
what will be the final state. */
|
what will be the final state. */
|
||||||
insert_start_shift ();
|
insert_start_shift ();
|
||||||
}
|
}
|
||||||
|
else if (sp->number == 0)
|
||||||
|
{
|
||||||
|
statep = first_state->next;
|
||||||
|
|
||||||
|
/* The states reached by shifts from FIRST_STATE are numbered
|
||||||
|
1..(SP->NSHIFTS). Look for one reached by START_SYMBOL. */
|
||||||
|
while (statep->accessing_symbol < start_symbol
|
||||||
|
&& statep->number < sp->nshifts)
|
||||||
|
statep = statep->next;
|
||||||
|
|
||||||
|
if (statep->accessing_symbol == start_symbol)
|
||||||
|
{
|
||||||
|
/* We already have a next-to-final state.
|
||||||
|
Make sure it has a shift to what will be the final state. */
|
||||||
|
while (sp && sp->number < statep->number)
|
||||||
|
{
|
||||||
|
sp1 = sp;
|
||||||
|
sp = sp->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sp && sp->number == statep->number)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
shifts *sp2 = shifts_new (sp->nshifts + 1);
|
||||||
|
sp2->number = statep->number;
|
||||||
|
sp2->shifts[0] = nstates;
|
||||||
|
for (i = sp->nshifts; i > 0; i--)
|
||||||
|
sp2->shifts[i] = sp->shifts[i - 1];
|
||||||
|
|
||||||
|
/* Patch sp2 into the chain of shifts in place of sp,
|
||||||
|
following sp1. */
|
||||||
|
sp2->next = sp->next;
|
||||||
|
sp1->next = sp2;
|
||||||
|
if (sp == last_shift)
|
||||||
|
last_shift = sp2;
|
||||||
|
XFREE (sp);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
shifts *sp2 = shifts_new (1);
|
||||||
|
sp2->number = statep->number;
|
||||||
|
sp2->shifts[0] = nstates;
|
||||||
|
|
||||||
|
/* Patch sp2 into the chain of shifts between sp1 and sp. */
|
||||||
|
sp2->next = sp;
|
||||||
|
sp1->next = sp2;
|
||||||
|
if (sp == 0)
|
||||||
|
last_shift = sp2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int i, k;
|
||||||
|
shifts *sp2;
|
||||||
|
|
||||||
|
/* There is no next-to-final state as yet. */
|
||||||
|
/* Add one more shift in first_shift,
|
||||||
|
going to the next-to-final state (yet to be made). */
|
||||||
|
sp = first_shift;
|
||||||
|
|
||||||
|
sp2 = shifts_new (sp->nshifts + 1);
|
||||||
|
|
||||||
|
/* Stick this shift into the vector at the proper place. */
|
||||||
|
statep = first_state->next;
|
||||||
|
for (k = 0, i = 0; i < sp->nshifts; k++, i++)
|
||||||
|
{
|
||||||
|
if (statep->accessing_symbol > start_symbol && i == k)
|
||||||
|
sp2->shifts[k++] = nstates;
|
||||||
|
sp2->shifts[k] = sp->shifts[i];
|
||||||
|
statep = statep->next;
|
||||||
|
}
|
||||||
|
if (i == k)
|
||||||
|
sp2->shifts[k++] = nstates;
|
||||||
|
|
||||||
|
/* Patch sp2 into the chain of shifts
|
||||||
|
in place of sp, at the beginning. */
|
||||||
|
sp2->next = sp->next;
|
||||||
|
first_shift = sp2;
|
||||||
|
if (last_shift == sp)
|
||||||
|
last_shift = sp2;
|
||||||
|
|
||||||
|
XFREE (sp);
|
||||||
|
|
||||||
|
/* Create the next-to-final state, with shift to
|
||||||
|
what will be the final state. */
|
||||||
|
insert_start_shift ();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* The initial state didn't even have any shifts.
|
||||||
|
Give it one shift, to the next-to-final state. */
|
||||||
|
sp = shifts_new (1);
|
||||||
|
sp->shifts[0] = nstates;
|
||||||
|
|
||||||
|
/* Patch sp into the chain of shifts at the beginning. */
|
||||||
|
sp->next = first_shift;
|
||||||
|
first_shift = sp;
|
||||||
|
|
||||||
|
/* Create the next-to-final state, with shift to
|
||||||
|
what will be the final state. */
|
||||||
|
insert_start_shift ();
|
||||||
|
}
|
||||||
|
|
||||||
/* Make the final state--the one that follows a shift from the
|
/* Make the final state--the one that follows a shift from the
|
||||||
next-to-final state.
|
next-to-final state.
|
||||||
The symbol for that shift is 0 (end-of-file). */
|
The symbol for that shift is 0 (end-of-file). */
|
||||||
statep = (core *) xcalloc ((unsigned) (sizeof (core) - sizeof (short)), 1);
|
statep = CORE_ALLOC (0);
|
||||||
statep->number = nstates;
|
statep->number = nstates;
|
||||||
last_state->next = statep;
|
last_state->next = statep;
|
||||||
last_state = statep;
|
last_state = statep;
|
||||||
|
|
||||||
/* Make the shift from the final state to the termination state. */
|
/* Make the shift from the final state to the termination state. */
|
||||||
sp = XCALLOC (shifts, 1);
|
sp = shifts_new (1);
|
||||||
sp->number = nstates++;
|
sp->number = nstates++;
|
||||||
sp->nshifts = 1;
|
|
||||||
sp->shifts[0] = nstates;
|
sp->shifts[0] = nstates;
|
||||||
last_shift->next = sp;
|
last_shift->next = sp;
|
||||||
last_shift = sp;
|
last_shift = sp;
|
||||||
@@ -590,7 +517,7 @@ augment_automaton (void)
|
|||||||
final_state = nstates;
|
final_state = nstates;
|
||||||
|
|
||||||
/* Make the termination state. */
|
/* Make the termination state. */
|
||||||
statep = (core *) xcalloc ((unsigned) (sizeof (core) - sizeof (short)), 1);
|
statep = CORE_ALLOC (0);
|
||||||
statep->number = nstates++;
|
statep->number = nstates++;
|
||||||
last_state->next = statep;
|
last_state->next = statep;
|
||||||
last_state = statep;
|
last_state = statep;
|
||||||
@@ -606,21 +533,15 @@ augment_automaton (void)
|
|||||||
static void
|
static void
|
||||||
save_reductions (void)
|
save_reductions (void)
|
||||||
{
|
{
|
||||||
short *isp;
|
|
||||||
short *rp1;
|
|
||||||
short *rp2;
|
|
||||||
int item;
|
|
||||||
int count;
|
int count;
|
||||||
reductions *p;
|
int i;
|
||||||
|
|
||||||
short *rend;
|
|
||||||
|
|
||||||
/* Find and count the active items that represent ends of rules. */
|
/* Find and count the active items that represent ends of rules. */
|
||||||
|
|
||||||
count = 0;
|
count = 0;
|
||||||
for (isp = itemset; isp < itemsetend; isp++)
|
for (i = 0; i < nitemset; ++i)
|
||||||
{
|
{
|
||||||
item = ritem[*isp];
|
int item = ritem[itemset[i]];
|
||||||
if (item < 0)
|
if (item < 0)
|
||||||
redset[count++] = -item;
|
redset[count++] = -item;
|
||||||
}
|
}
|
||||||
@@ -629,29 +550,18 @@ save_reductions (void)
|
|||||||
|
|
||||||
if (count)
|
if (count)
|
||||||
{
|
{
|
||||||
p = (reductions *) xcalloc ((unsigned) (sizeof (reductions) +
|
reductions *p = REDUCTIONS_ALLOC (count);
|
||||||
(count - 1) * sizeof (short)), 1);
|
|
||||||
|
|
||||||
p->number = this_state->number;
|
p->number = this_state->number;
|
||||||
p->nreds = count;
|
p->nreds = count;
|
||||||
|
|
||||||
rp1 = redset;
|
shortcpy (p->rules, redset, count);
|
||||||
rp2 = p->rules;
|
|
||||||
rend = rp1 + count;
|
|
||||||
|
|
||||||
for (/* nothing */; rp1 < rend; ++rp1, ++rp2)
|
|
||||||
*rp2 = *rp1;
|
|
||||||
|
|
||||||
if (last_reduction)
|
if (last_reduction)
|
||||||
{
|
last_reduction->next = p;
|
||||||
last_reduction->next = p;
|
|
||||||
last_reduction = p;
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
first_reduction = p;
|
||||||
first_reduction = p;
|
last_reduction = p;
|
||||||
last_reduction = p;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -670,6 +580,9 @@ generate_states (void)
|
|||||||
|
|
||||||
while (this_state)
|
while (this_state)
|
||||||
{
|
{
|
||||||
|
if (trace_flag)
|
||||||
|
fprintf (stderr, "Processing state %d (reached by %s)\n",
|
||||||
|
this_state->number, tags[this_state->accessing_symbol]);
|
||||||
/* Set up ruleset and itemset for the transitions out of this
|
/* Set up ruleset and itemset for the transitions out of this
|
||||||
state. ruleset gets a 1 bit for each rule that could reduce
|
state. ruleset gets a 1 bit for each rule that could reduce
|
||||||
now. itemset gets a vector of all the items that could be
|
now. itemset gets a vector of all the items that could be
|
||||||
@@ -684,8 +597,7 @@ generate_states (void)
|
|||||||
|
|
||||||
/* create the shifts structures for the shifts to those states,
|
/* create the shifts structures for the shifts to those states,
|
||||||
now that the state numbers transitioning to are known */
|
now that the state numbers transitioning to are known */
|
||||||
if (nshifts > 0)
|
save_shifts ();
|
||||||
save_shifts ();
|
|
||||||
|
|
||||||
/* states are queued when they are created; process them all */
|
/* states are queued when they are created; process them all */
|
||||||
this_state = this_state->next;
|
this_state = this_state->next;
|
||||||
|
|||||||
+31
-6
@@ -1,19 +1,45 @@
|
|||||||
## Process this file with automake to produce Makefile.in -*-Makefile-*-
|
## Copyright 2001 Free Software Foundation, Inc.
|
||||||
AUTOMAKE_OPTIONS = 1.4 ../lib/ansi2knr
|
|
||||||
|
## 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 of the License, 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
|
||||||
|
|
||||||
|
AUTOMAKE_OPTIONS = ../lib/ansi2knr
|
||||||
|
|
||||||
DEFS = @DEFS@ \
|
DEFS = @DEFS@ \
|
||||||
-DBISON_SIMPLE=\"$(pkgdatadir)/bison.simple\" \
|
-DBISON_SIMPLE=\"$(pkgdatadir)/bison.simple\" \
|
||||||
-DBISON_HAIRY=\"$(pkgdatadir)/bison.hairy\" \
|
-DBISON_HAIRY=\"$(pkgdatadir)/bison.hairy\" \
|
||||||
-DLOCALEDIR=\"$(datadir)/locale\"
|
-DLOCALEDIR=\"$(datadir)/locale\"
|
||||||
|
|
||||||
INCLUDES = -I../intl -I$(top_srcdir)/lib -I..
|
CFLAGS = @CFLAGS@ $(WARNING_CFLAGS)
|
||||||
LDADD = @INTLLIBS@ ../lib/libbison.a
|
|
||||||
|
# libintl.h in is build/intl, intl/libgettext.h in src/,
|
||||||
|
# config.h in build/.
|
||||||
|
INCLUDES = -I$(top_builddir)/intl \
|
||||||
|
-I$(top_builddir) \
|
||||||
|
-I$(top_srcdir)/lib \
|
||||||
|
-I$(top_srcdir)
|
||||||
|
|
||||||
|
LDADD = $(INTLLIBS) ../lib/libbison.a
|
||||||
|
|
||||||
bin_PROGRAMS = bison
|
bin_PROGRAMS = bison
|
||||||
|
|
||||||
bison_SOURCES = LR0.c closure.c complain.c conflicts.c \
|
bison_SOURCES = LR0.c closure.c complain.c conflicts.c \
|
||||||
derives.c \
|
derives.c \
|
||||||
files.c getargs.c gram.c lalr.c lex.c main.c nullable.c \
|
files.c getargs.c gram.c lalr.c lex.c main.c nullable.c \
|
||||||
output.c \
|
output.h output.c \
|
||||||
|
state.h state.c \
|
||||||
print.c reader.c reduce.c symtab.c warshall.c vcg.c print_graph.c
|
print.c reader.c reduce.c symtab.c warshall.c vcg.c print_graph.c
|
||||||
|
|
||||||
EXTRA_bison_SOURCES = vmsgetargs.c
|
EXTRA_bison_SOURCES = vmsgetargs.c
|
||||||
@@ -21,7 +47,6 @@ EXTRA_bison_SOURCES = vmsgetargs.c
|
|||||||
noinst_HEADERS = LR0.h closure.h complain.h conflicts.h \
|
noinst_HEADERS = LR0.h closure.h complain.h conflicts.h \
|
||||||
derives.h \
|
derives.h \
|
||||||
files.h getargs.h gram.h lalr.h lex.h nullable.h \
|
files.h getargs.h gram.h lalr.h lex.h nullable.h \
|
||||||
output.h state.h \
|
|
||||||
print.h reader.h reduce.h symtab.h warshall.h system.h types.h \
|
print.h reader.h reduce.h symtab.h warshall.h system.h types.h \
|
||||||
vcg.h vcg_defaults.h print_graph.h
|
vcg.h vcg_defaults.h print_graph.h
|
||||||
|
|
||||||
|
|||||||
+31
-19
@@ -1,4 +1,5 @@
|
|||||||
# Makefile.in generated automatically by automake 1.5a from Makefile.am.
|
# Makefile.in generated by automake 1.5a from Makefile.am.
|
||||||
|
# @configure_input@
|
||||||
|
|
||||||
# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
|
# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
|
||||||
# Free Software Foundation, Inc.
|
# Free Software Foundation, Inc.
|
||||||
@@ -83,8 +84,8 @@ INTLBISON = @INTLBISON@
|
|||||||
INTLLIBS = @INTLLIBS@
|
INTLLIBS = @INTLLIBS@
|
||||||
INTLOBJS = @INTLOBJS@
|
INTLOBJS = @INTLOBJS@
|
||||||
INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
|
INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
|
||||||
|
LIB = @LIB@
|
||||||
LIBICONV = @LIBICONV@
|
LIBICONV = @LIBICONV@
|
||||||
LIBOBJS = @LIBOBJS@
|
|
||||||
MKINSTALLDIRS = @MKINSTALLDIRS@
|
MKINSTALLDIRS = @MKINSTALLDIRS@
|
||||||
MSGFMT = @MSGFMT@
|
MSGFMT = @MSGFMT@
|
||||||
PACKAGE = @PACKAGE@
|
PACKAGE = @PACKAGE@
|
||||||
@@ -100,22 +101,33 @@ am__include = @am__include@
|
|||||||
am__quote = @am__quote@
|
am__quote = @am__quote@
|
||||||
install_sh = @install_sh@
|
install_sh = @install_sh@
|
||||||
|
|
||||||
AUTOMAKE_OPTIONS = 1.4 ../lib/ansi2knr
|
AUTOMAKE_OPTIONS = ../lib/ansi2knr
|
||||||
|
|
||||||
DEFS = @DEFS@ \
|
DEFS = @DEFS@ \
|
||||||
-DBISON_SIMPLE=\"$(pkgdatadir)/bison.simple\" \
|
-DBISON_SIMPLE=\"$(pkgdatadir)/bison.simple\" \
|
||||||
-DBISON_HAIRY=\"$(pkgdatadir)/bison.hairy\" \
|
-DBISON_HAIRY=\"$(pkgdatadir)/bison.hairy\" \
|
||||||
-DLOCALEDIR=\"$(datadir)/locale\"
|
-DLOCALEDIR=\"$(datadir)/locale\"
|
||||||
|
|
||||||
|
|
||||||
INCLUDES = -I../intl -I$(top_srcdir)/lib -I..
|
CFLAGS = @CFLAGS@ $(WARNING_CFLAGS)
|
||||||
LDADD = @INTLLIBS@ ../lib/libbison.a
|
|
||||||
|
# libintl.h in is build/intl, intl/libgettext.h in src/,
|
||||||
|
# config.h in build/.
|
||||||
|
INCLUDES = -I$(top_builddir)/intl \
|
||||||
|
-I$(top_builddir) \
|
||||||
|
-I$(top_srcdir)/lib \
|
||||||
|
-I$(top_srcdir)
|
||||||
|
|
||||||
|
|
||||||
|
LDADD = $(INTLLIBS) ../lib/libbison.a
|
||||||
|
|
||||||
bin_PROGRAMS = bison
|
bin_PROGRAMS = bison
|
||||||
|
|
||||||
bison_SOURCES = LR0.c closure.c complain.c conflicts.c \
|
bison_SOURCES = LR0.c closure.c complain.c conflicts.c \
|
||||||
derives.c \
|
derives.c \
|
||||||
files.c getargs.c gram.c lalr.c lex.c main.c nullable.c \
|
files.c getargs.c gram.c lalr.c lex.c main.c nullable.c \
|
||||||
output.c \
|
output.h output.c \
|
||||||
|
state.h state.c \
|
||||||
print.c reader.c reduce.c symtab.c warshall.c vcg.c print_graph.c
|
print.c reader.c reduce.c symtab.c warshall.c vcg.c print_graph.c
|
||||||
|
|
||||||
|
|
||||||
@@ -124,7 +136,6 @@ EXTRA_bison_SOURCES = vmsgetargs.c
|
|||||||
noinst_HEADERS = LR0.h closure.h complain.h conflicts.h \
|
noinst_HEADERS = LR0.h closure.h complain.h conflicts.h \
|
||||||
derives.h \
|
derives.h \
|
||||||
files.h getargs.h gram.h lalr.h lex.h nullable.h \
|
files.h getargs.h gram.h lalr.h lex.h nullable.h \
|
||||||
output.h state.h \
|
|
||||||
print.h reader.h reduce.h symtab.h warshall.h system.h types.h \
|
print.h reader.h reduce.h symtab.h warshall.h system.h types.h \
|
||||||
vcg.h vcg_defaults.h print_graph.h
|
vcg.h vcg_defaults.h print_graph.h
|
||||||
|
|
||||||
@@ -143,9 +154,10 @@ am_bison_OBJECTS = LR0$U.$(OBJEXT) closure$U.$(OBJEXT) \
|
|||||||
complain$U.$(OBJEXT) conflicts$U.$(OBJEXT) derives$U.$(OBJEXT) \
|
complain$U.$(OBJEXT) conflicts$U.$(OBJEXT) derives$U.$(OBJEXT) \
|
||||||
files$U.$(OBJEXT) getargs$U.$(OBJEXT) gram$U.$(OBJEXT) \
|
files$U.$(OBJEXT) getargs$U.$(OBJEXT) gram$U.$(OBJEXT) \
|
||||||
lalr$U.$(OBJEXT) lex$U.$(OBJEXT) main$U.$(OBJEXT) \
|
lalr$U.$(OBJEXT) lex$U.$(OBJEXT) main$U.$(OBJEXT) \
|
||||||
nullable$U.$(OBJEXT) output$U.$(OBJEXT) print$U.$(OBJEXT) \
|
nullable$U.$(OBJEXT) output$U.$(OBJEXT) state$U.$(OBJEXT) \
|
||||||
reader$U.$(OBJEXT) reduce$U.$(OBJEXT) symtab$U.$(OBJEXT) \
|
print$U.$(OBJEXT) reader$U.$(OBJEXT) reduce$U.$(OBJEXT) \
|
||||||
warshall$U.$(OBJEXT) vcg$U.$(OBJEXT) print_graph$U.$(OBJEXT)
|
symtab$U.$(OBJEXT) warshall$U.$(OBJEXT) vcg$U.$(OBJEXT) \
|
||||||
|
print_graph$U.$(OBJEXT)
|
||||||
bison_OBJECTS = $(am_bison_OBJECTS)
|
bison_OBJECTS = $(am_bison_OBJECTS)
|
||||||
bison_LDADD = $(LDADD)
|
bison_LDADD = $(LDADD)
|
||||||
bison_DEPENDENCIES = ../lib/libbison.a
|
bison_DEPENDENCIES = ../lib/libbison.a
|
||||||
@@ -163,14 +175,13 @@ depcomp = $(SHELL) $(top_srcdir)/config/depcomp
|
|||||||
@AMDEP_TRUE@ $(DEPDIR)/main$U.Po $(DEPDIR)/nullable$U.Po \
|
@AMDEP_TRUE@ $(DEPDIR)/main$U.Po $(DEPDIR)/nullable$U.Po \
|
||||||
@AMDEP_TRUE@ $(DEPDIR)/output$U.Po $(DEPDIR)/print$U.Po \
|
@AMDEP_TRUE@ $(DEPDIR)/output$U.Po $(DEPDIR)/print$U.Po \
|
||||||
@AMDEP_TRUE@ $(DEPDIR)/print_graph$U.Po $(DEPDIR)/reader$U.Po \
|
@AMDEP_TRUE@ $(DEPDIR)/print_graph$U.Po $(DEPDIR)/reader$U.Po \
|
||||||
@AMDEP_TRUE@ $(DEPDIR)/reduce$U.Po $(DEPDIR)/symtab$U.Po \
|
@AMDEP_TRUE@ $(DEPDIR)/reduce$U.Po $(DEPDIR)/state$U.Po \
|
||||||
@AMDEP_TRUE@ $(DEPDIR)/vcg$U.Po $(DEPDIR)/vmsgetargs$U.Po \
|
@AMDEP_TRUE@ $(DEPDIR)/symtab$U.Po $(DEPDIR)/vcg$U.Po \
|
||||||
@AMDEP_TRUE@ $(DEPDIR)/warshall$U.Po
|
@AMDEP_TRUE@ $(DEPDIR)/vmsgetargs$U.Po $(DEPDIR)/warshall$U.Po
|
||||||
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
|
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
|
||||||
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
||||||
CCLD = $(CC)
|
CCLD = $(CC)
|
||||||
LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
|
LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
|
||||||
CFLAGS = @CFLAGS@
|
|
||||||
DIST_SOURCES = $(bison_SOURCES) $(EXTRA_bison_SOURCES)
|
DIST_SOURCES = $(bison_SOURCES) $(EXTRA_bison_SOURCES)
|
||||||
DATA = $(pkgdata_DATA)
|
DATA = $(pkgdata_DATA)
|
||||||
|
|
||||||
@@ -187,9 +198,7 @@ $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
|
|||||||
cd $(top_srcdir) && \
|
cd $(top_srcdir) && \
|
||||||
$(AUTOMAKE) --gnu src/Makefile
|
$(AUTOMAKE) --gnu src/Makefile
|
||||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||||
cd $(top_builddir) && \
|
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
|
||||||
CONFIG_HEADERS= CONFIG_LINKS= \
|
|
||||||
CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status
|
|
||||||
install-binPROGRAMS: $(bin_PROGRAMS)
|
install-binPROGRAMS: $(bin_PROGRAMS)
|
||||||
@$(NORMAL_INSTALL)
|
@$(NORMAL_INSTALL)
|
||||||
$(mkinstalldirs) $(DESTDIR)$(bindir)
|
$(mkinstalldirs) $(DESTDIR)$(bindir)
|
||||||
@@ -228,7 +237,7 @@ ANSI2KNR = ../lib/ansi2knr
|
|||||||
cd ../lib && $(MAKE) $(AM_MAKEFLAGS) ansi2knr
|
cd ../lib && $(MAKE) $(AM_MAKEFLAGS) ansi2knr
|
||||||
|
|
||||||
mostlyclean-kr:
|
mostlyclean-kr:
|
||||||
-rm -f *_.c
|
-test "$U" = "" || rm -f *_.c
|
||||||
|
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/LR0$U.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/LR0$U.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/closure$U.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/closure$U.Po@am__quote@
|
||||||
@@ -247,6 +256,7 @@ mostlyclean-kr:
|
|||||||
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/print_graph$U.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/print_graph$U.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/reader$U.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/reader$U.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/reduce$U.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/reduce$U.Po@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/state$U.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/symtab$U.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/symtab$U.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/vcg$U.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/vcg$U.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/vmsgetargs$U.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/vmsgetargs$U.Po@am__quote@
|
||||||
@@ -301,6 +311,8 @@ reader_.c: reader.c $(ANSI2KNR)
|
|||||||
$(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/reader.c; then echo $(srcdir)/reader.c; else echo reader.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > reader_.c || rm -f reader_.c
|
$(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/reader.c; then echo $(srcdir)/reader.c; else echo reader.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > reader_.c || rm -f reader_.c
|
||||||
reduce_.c: reduce.c $(ANSI2KNR)
|
reduce_.c: reduce.c $(ANSI2KNR)
|
||||||
$(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/reduce.c; then echo $(srcdir)/reduce.c; else echo reduce.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > reduce_.c || rm -f reduce_.c
|
$(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/reduce.c; then echo $(srcdir)/reduce.c; else echo reduce.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > reduce_.c || rm -f reduce_.c
|
||||||
|
state_.c: state.c $(ANSI2KNR)
|
||||||
|
$(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/state.c; then echo $(srcdir)/state.c; else echo state.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > state_.c || rm -f state_.c
|
||||||
symtab_.c: symtab.c $(ANSI2KNR)
|
symtab_.c: symtab.c $(ANSI2KNR)
|
||||||
$(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/symtab.c; then echo $(srcdir)/symtab.c; else echo symtab.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > symtab_.c || rm -f symtab_.c
|
$(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/symtab.c; then echo $(srcdir)/symtab.c; else echo symtab.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > symtab_.c || rm -f symtab_.c
|
||||||
vcg_.c: vcg.c $(ANSI2KNR)
|
vcg_.c: vcg.c $(ANSI2KNR)
|
||||||
@@ -314,7 +326,7 @@ conflicts_.$(OBJEXT) derives_.$(OBJEXT) files_.$(OBJEXT) \
|
|||||||
getargs_.$(OBJEXT) gram_.$(OBJEXT) lalr_.$(OBJEXT) lex_.$(OBJEXT) \
|
getargs_.$(OBJEXT) gram_.$(OBJEXT) lalr_.$(OBJEXT) lex_.$(OBJEXT) \
|
||||||
main_.$(OBJEXT) nullable_.$(OBJEXT) output_.$(OBJEXT) print_.$(OBJEXT) \
|
main_.$(OBJEXT) nullable_.$(OBJEXT) output_.$(OBJEXT) print_.$(OBJEXT) \
|
||||||
print_graph_.$(OBJEXT) reader_.$(OBJEXT) reduce_.$(OBJEXT) \
|
print_graph_.$(OBJEXT) reader_.$(OBJEXT) reduce_.$(OBJEXT) \
|
||||||
symtab_.$(OBJEXT) vcg_.$(OBJEXT) vmsgetargs_.$(OBJEXT) \
|
state_.$(OBJEXT) symtab_.$(OBJEXT) vcg_.$(OBJEXT) vmsgetargs_.$(OBJEXT) \
|
||||||
warshall_.$(OBJEXT) : $(ANSI2KNR)
|
warshall_.$(OBJEXT) : $(ANSI2KNR)
|
||||||
uninstall-info-am:
|
uninstall-info-am:
|
||||||
install-pkgdataDATA: $(pkgdata_DATA)
|
install-pkgdataDATA: $(pkgdata_DATA)
|
||||||
|
|||||||
+290
-191
@@ -28,58 +28,112 @@
|
|||||||
It was written by Richard Stallman by simplifying the hairy parser
|
It was written by Richard Stallman by simplifying the hairy parser
|
||||||
used when %semantic_parser is specified. */
|
used when %semantic_parser is specified. */
|
||||||
|
|
||||||
#ifndef YYSTACK_USE_ALLOCA
|
/* All symbols defined below should begin with yy or YY, to avoid
|
||||||
# ifdef alloca
|
infringing on user name space. This should be done even for local
|
||||||
# define YYSTACK_USE_ALLOCA 1
|
variables, as they might otherwise be expanded by user macros.
|
||||||
# else /* alloca not defined */
|
There are some unavoidable exceptions within include files to
|
||||||
# ifdef __GNUC__
|
define necessary C library symbols; they are noted "INFRINGES ON
|
||||||
# define YYSTACK_USE_ALLOCA 1
|
USER NAME SPACE" below. */
|
||||||
# define alloca __builtin_alloca
|
|
||||||
# else /* not GNU C. */
|
#if ! defined (yyoverflow) || defined (YYERROR_VERBOSE)
|
||||||
# if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) || (defined (__sun) && defined (__i386))
|
|
||||||
# define YYSTACK_USE_ALLOCA 1
|
/* The parser invokes alloca or malloc; define the necessary symbols. */
|
||||||
# include <alloca.h>
|
|
||||||
# else /* not sparc */
|
# if YYSTACK_USE_ALLOCA
|
||||||
/* We think this test detects Watcom and Microsoft C. */
|
# define YYSTACK_ALLOC alloca
|
||||||
/* This used to test MSDOS, but that is a bad idea since that
|
# define YYSIZE_T size_t
|
||||||
symbol is in the user namespace. */
|
# else
|
||||||
# if (defined (_MSDOS) || defined (_MSDOS_)) && !defined (__TURBOC__)
|
# ifndef YYSTACK_USE_ALLOCA
|
||||||
# if 0
|
# if defined (alloca) || defined (_ALLOCA_H)
|
||||||
/* No need for malloc.h, which pollutes the namespace; instead,
|
# define YYSTACK_ALLOC alloca
|
||||||
just don't use alloca. */
|
# define YYSIZE_T size_t
|
||||||
# include <malloc.h>
|
# else
|
||||||
|
# if defined (__GNUC__) || defined (_AIX) || defined (__hpux)
|
||||||
|
# define YYSTACK_ALLOC __builtin_alloca
|
||||||
|
# endif
|
||||||
|
# ifndef __GNUC__
|
||||||
|
# ifdef _AIX
|
||||||
|
# pragma alloca
|
||||||
# endif
|
# endif
|
||||||
# else /* not MSDOS, or __TURBOC__ */
|
# if defined (__sgi) || defined (__sparc__) || defined (__sparc) || defined (__sun)
|
||||||
# if defined(_AIX)
|
# include <alloca.h> /* INFRINGES ON USER NAME SPACE */
|
||||||
/* I don't know what this was needed for, but it pollutes the
|
# define YYSTACK_ALLOC alloca
|
||||||
namespace. So I turned it off. rms, 2 May 1997. */
|
# define YYSIZE_T size_t
|
||||||
/* #include <malloc.h> */
|
# endif
|
||||||
#pragma alloca
|
# endif
|
||||||
# define YYSTACK_USE_ALLOCA 1
|
# endif
|
||||||
# else /* not MSDOS, or __TURBOC__, or _AIX */
|
# endif
|
||||||
# if 0
|
# endif
|
||||||
/* [email protected] says this works for HPUX 9.05 and up, and on
|
|
||||||
HPUX 10. Eventually we can turn this on. */
|
|
||||||
# ifdef __hpux
|
|
||||||
# define YYSTACK_USE_ALLOCA 1
|
|
||||||
# define alloca __builtin_alloca
|
|
||||||
# endif /* __hpux */
|
|
||||||
# endif
|
|
||||||
# endif /* not _AIX */
|
|
||||||
# endif /* not MSDOS, or __TURBOC__ */
|
|
||||||
# endif /* not sparc */
|
|
||||||
# endif /* not GNU C */
|
|
||||||
# endif /* alloca not defined */
|
|
||||||
#endif /* YYSTACK_USE_ALLOCA not defined */
|
|
||||||
|
|
||||||
#ifndef YYSTACK_USE_ALLOCA
|
# ifdef YYSTACK_ALLOC
|
||||||
# define YYSTACK_USE_ALLOCA 0
|
/* Pacify GCC's `empty if-body' warning. */
|
||||||
|
# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
|
||||||
|
# else
|
||||||
|
# define YYSTACK_ALLOC malloc
|
||||||
|
# define YYSTACK_FREE(Ptr) free (Ptr)
|
||||||
|
# if defined (__STDC__) || defined (__cplusplus)
|
||||||
|
# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
|
||||||
|
# define YYSIZE_T size_t
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
|
||||||
|
/* A type that is properly aligned for any stack member. */
|
||||||
|
union yyalloc
|
||||||
|
{
|
||||||
|
short yyss;
|
||||||
|
YYSTYPE yyvs;
|
||||||
|
# if YYLSP_NEEDED
|
||||||
|
YYLTYPE yyls;
|
||||||
|
# endif
|
||||||
|
};
|
||||||
|
|
||||||
|
/* The size of the maximum gap between one aligned stack and the next. */
|
||||||
|
# define YYSTACK_GAP_MAX (sizeof (union yyalloc) - 1)
|
||||||
|
|
||||||
|
/* The size of an array large to enough to hold all stacks, each with
|
||||||
|
N elements. */
|
||||||
|
# if YYLSP_NEEDED
|
||||||
|
# define YYSTACK_BYTES(N) \
|
||||||
|
((N) * (sizeof (short) + sizeof (YYSTYPE) + sizeof (YYLTYPE)) \
|
||||||
|
+ 2 * YYSTACK_GAP_MAX)
|
||||||
|
# else
|
||||||
|
# define YYSTACK_BYTES(N) \
|
||||||
|
((N) * (sizeof (short) + sizeof (YYSTYPE)) \
|
||||||
|
+ YYSTACK_GAP_MAX)
|
||||||
|
# endif
|
||||||
|
|
||||||
|
/* Relocate the TYPE STACK from its old location to the new one. The
|
||||||
|
local variables YYSIZE and YYSTACKSIZE give the old and new number of
|
||||||
|
elements in the stack, and YYPTR gives the new location of the
|
||||||
|
stack. Advance YYPTR to a properly aligned location for the next
|
||||||
|
stack. */
|
||||||
|
# define YYSTACK_RELOCATE(Type, Stack) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
YYSIZE_T yynewbytes; \
|
||||||
|
yymemcpy ((char *) yyptr, (char *) (Stack), \
|
||||||
|
yysize * (YYSIZE_T) sizeof (Type)); \
|
||||||
|
Stack = &yyptr->Stack; \
|
||||||
|
yynewbytes = yystacksize * sizeof (Type) + YYSTACK_GAP_MAX; \
|
||||||
|
yyptr += yynewbytes / sizeof (*yyptr); \
|
||||||
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
|
#endif /* ! defined (yyoverflow) || defined (YYERROR_VERBOSE) */
|
||||||
|
|
||||||
|
|
||||||
|
#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)
|
||||||
|
# define YYSIZE_T __SIZE_TYPE__
|
||||||
#endif
|
#endif
|
||||||
|
#if ! defined (YYSIZE_T) && defined (size_t)
|
||||||
#if YYSTACK_USE_ALLOCA
|
# define YYSIZE_T size_t
|
||||||
# define YYSTACK_ALLOC alloca
|
#endif
|
||||||
#else
|
#if ! defined (YYSIZE_T) && (defined (__STDC__) || defined (__cplusplus))
|
||||||
# define YYSTACK_ALLOC malloc
|
# include <stddef.h> /* INFRINGES ON USER NAME SPACE */
|
||||||
|
# define YYSIZE_T size_t
|
||||||
|
#endif
|
||||||
|
#if ! defined (YYSIZE_T)
|
||||||
|
# define YYSIZE_T unsigned int
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define yyerrok (yyerrstatus = 0)
|
#define yyerrok (yyerrstatus = 0)
|
||||||
@@ -152,6 +206,7 @@ while (0)
|
|||||||
|
|
||||||
/* Enable debugging if requested. */
|
/* Enable debugging if requested. */
|
||||||
#if YYDEBUG
|
#if YYDEBUG
|
||||||
|
# include <stdio.h>
|
||||||
# define YYDPRINTF(Args) \
|
# define YYDPRINTF(Args) \
|
||||||
do { \
|
do { \
|
||||||
if (yydebug) \
|
if (yydebug) \
|
||||||
@@ -172,7 +227,12 @@ int yydebug;
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
|
/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
|
||||||
if the built-in stack extension method is used). */
|
if the built-in stack extension method is used).
|
||||||
|
|
||||||
|
Do not make this value too large; the results are undefined if
|
||||||
|
SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH)
|
||||||
|
evaluated with infinite-precision integer arithmetic. */
|
||||||
|
|
||||||
#if YYMAXDEPTH == 0
|
#if YYMAXDEPTH == 0
|
||||||
# undef YYMAXDEPTH
|
# undef YYMAXDEPTH
|
||||||
#endif
|
#endif
|
||||||
@@ -181,35 +241,83 @@ int yydebug;
|
|||||||
# define YYMAXDEPTH 10000
|
# define YYMAXDEPTH 10000
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Define __yy_memcpy. Note that the size argument
|
#if ! defined (yyoverflow) && ! defined (yymemcpy)
|
||||||
should be passed with type unsigned int, because that is what the non-GCC
|
# if __GNUC__ > 1 /* GNU C and GNU C++ define this. */
|
||||||
definitions require. With GCC, __builtin_memcpy takes an arg
|
# define yymemcpy __builtin_memcpy
|
||||||
of type size_t, but it can handle unsigned int. */
|
# else /* not GNU C or C++ */
|
||||||
|
|
||||||
#if __GNUC__ > 1 /* GNU C and GNU C++ define this. */
|
|
||||||
# define __yy_memcpy(To, From, Count) __builtin_memcpy (To, From, Count)
|
|
||||||
#else /* not GNU C or C++ */
|
|
||||||
|
|
||||||
/* This is the most reliable way to avoid incompatibilities
|
/* This is the most reliable way to avoid incompatibilities
|
||||||
in available built-in functions on various systems. */
|
in available built-in functions on various systems. */
|
||||||
static void
|
static void
|
||||||
# ifndef __cplusplus
|
# if defined (__STDC__) || defined (__cplusplus)
|
||||||
__yy_memcpy (to, from, count)
|
yymemcpy (char *yyto, const char *yyfrom, YYSIZE_T yycount)
|
||||||
char *to;
|
# else
|
||||||
const char *from;
|
yymemcpy (yyto, yyfrom, yycount)
|
||||||
unsigned int count;
|
char *yyto;
|
||||||
# else /* __cplusplus */
|
const char *yyfrom;
|
||||||
__yy_memcpy (char *to, const char *from, unsigned int count)
|
YYSIZE_T yycount;
|
||||||
# endif
|
# endif
|
||||||
{
|
{
|
||||||
register const char *f = from;
|
register const char *yyf = yyfrom;
|
||||||
register char *t = to;
|
register char *yyt = yyto;
|
||||||
register int i = count;
|
register YYSIZE_T yyi = yycount;
|
||||||
|
|
||||||
while (i-- > 0)
|
while (yyi-- != 0)
|
||||||
*t++ = *f++;
|
*yyt++ = *yyf++;
|
||||||
}
|
}
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef YYERROR_VERBOSE
|
||||||
|
|
||||||
|
# ifndef yystrlen
|
||||||
|
# if defined (__GLIBC__) && defined (_STRING_H)
|
||||||
|
# define yystrlen strlen
|
||||||
|
# else
|
||||||
|
/* Return the length of YYSTR. */
|
||||||
|
static YYSIZE_T
|
||||||
|
# if defined (__STDC__) || defined (__cplusplus)
|
||||||
|
yystrlen (const char *yystr)
|
||||||
|
# else
|
||||||
|
yystrlen (yystr)
|
||||||
|
const char *yystr;
|
||||||
|
# endif
|
||||||
|
{
|
||||||
|
register const char *yys = yystr;
|
||||||
|
|
||||||
|
while (*yys++ != '\0')
|
||||||
|
continue;
|
||||||
|
|
||||||
|
return yys - yystr - 1;
|
||||||
|
}
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifndef yystpcpy
|
||||||
|
# if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE)
|
||||||
|
# define yystpcpy stpcpy
|
||||||
|
# else
|
||||||
|
/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
|
||||||
|
YYDEST. */
|
||||||
|
static char *
|
||||||
|
# if defined (__STDC__) || defined (__cplusplus)
|
||||||
|
yystpcpy (char *yydest, const char *yysrc)
|
||||||
|
# else
|
||||||
|
yystpcpy (yydest, yysrc)
|
||||||
|
char *yydest;
|
||||||
|
const char *yysrc;
|
||||||
|
# endif
|
||||||
|
{
|
||||||
|
register char *yyd = yydest;
|
||||||
|
register const char *yys = yysrc;
|
||||||
|
|
||||||
|
while ((*yyd++ = *yys++) != '\0')
|
||||||
|
continue;
|
||||||
|
|
||||||
|
return yyd - 1;
|
||||||
|
}
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#line
|
#line
|
||||||
@@ -245,7 +353,7 @@ int yyparse (void);
|
|||||||
/* YY_DECL_VARIABLES -- depending whether we use a pure parser,
|
/* YY_DECL_VARIABLES -- depending whether we use a pure parser,
|
||||||
variables are global, or local to YYPARSE. */
|
variables are global, or local to YYPARSE. */
|
||||||
|
|
||||||
#define _YY_DECL_VARIABLES \
|
#define YY_DECL_NON_LSP_VARIABLES \
|
||||||
/* The lookahead symbol. */ \
|
/* The lookahead symbol. */ \
|
||||||
int yychar; \
|
int yychar; \
|
||||||
\
|
\
|
||||||
@@ -257,13 +365,13 @@ int yynerrs;
|
|||||||
|
|
||||||
#if YYLSP_NEEDED
|
#if YYLSP_NEEDED
|
||||||
# define YY_DECL_VARIABLES \
|
# define YY_DECL_VARIABLES \
|
||||||
_YY_DECL_VARIABLES \
|
YY_DECL_NON_LSP_VARIABLES \
|
||||||
\
|
\
|
||||||
/* Location data for the lookahead symbol. */ \
|
/* Location data for the lookahead symbol. */ \
|
||||||
YYLTYPE yylloc;
|
YYLTYPE yylloc;
|
||||||
#else
|
#else
|
||||||
# define YY_DECL_VARIABLES \
|
# define YY_DECL_VARIABLES \
|
||||||
_YY_DECL_VARIABLES
|
YY_DECL_NON_LSP_VARIABLES
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
@@ -284,6 +392,7 @@ yyparse (YYPARSE_PARAM_ARG)
|
|||||||
|
|
||||||
register int yystate;
|
register int yystate;
|
||||||
register int yyn;
|
register int yyn;
|
||||||
|
int yyresult;
|
||||||
/* Number of tokens to shift before error messages enabled. */
|
/* Number of tokens to shift before error messages enabled. */
|
||||||
int yyerrstatus;
|
int yyerrstatus;
|
||||||
/* Lookahead token as an internal (translated) token number. */
|
/* Lookahead token as an internal (translated) token number. */
|
||||||
@@ -291,7 +400,7 @@ yyparse (YYPARSE_PARAM_ARG)
|
|||||||
|
|
||||||
/* Three stacks and their tools:
|
/* Three stacks and their tools:
|
||||||
`yyss': related to states,
|
`yyss': related to states,
|
||||||
`yysv': related to semantic values,
|
`yyvs': related to semantic values,
|
||||||
`yyls': related to locations.
|
`yyls': related to locations.
|
||||||
|
|
||||||
Refer to the stacks thru separate pointers, to allow yyoverflow
|
Refer to the stacks thru separate pointers, to allow yyoverflow
|
||||||
@@ -320,16 +429,15 @@ yyparse (YYPARSE_PARAM_ARG)
|
|||||||
# define YYPOPSTACK (yyvsp--, yyssp--)
|
# define YYPOPSTACK (yyvsp--, yyssp--)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int yystacksize = YYINITDEPTH;
|
YYSIZE_T yystacksize = YYINITDEPTH;
|
||||||
int yyfree_stacks = 0;
|
|
||||||
|
|
||||||
|
|
||||||
/* The variables used to return semantic value and location from the
|
/* The variables used to return semantic value and location from the
|
||||||
action routines. */
|
action routines. */
|
||||||
YYSTYPE yyval;
|
YYSTYPE yyval;
|
||||||
# if YYLSP_NEEDED
|
#if YYLSP_NEEDED
|
||||||
YYLTYPE yyloc;
|
YYLTYPE yyloc;
|
||||||
# endif
|
#endif
|
||||||
|
|
||||||
/* When reducing, the number of symbols on the RHS of the reduced
|
/* When reducing, the number of symbols on the RHS of the reduced
|
||||||
rule. */
|
rule. */
|
||||||
@@ -368,81 +476,71 @@ yyparse (YYPARSE_PARAM_ARG)
|
|||||||
|
|
||||||
if (yyssp >= yyss + yystacksize - 1)
|
if (yyssp >= yyss + yystacksize - 1)
|
||||||
{
|
{
|
||||||
/* Give user a chance to reallocate the stack. Use copies of
|
|
||||||
these so that the &'s don't force the real ones into memory.
|
|
||||||
*/
|
|
||||||
YYSTYPE *yyvs1 = yyvs;
|
|
||||||
short *yyss1 = yyss;
|
|
||||||
#if YYLSP_NEEDED
|
|
||||||
YYLTYPE *yyls1 = yyls;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Get the current used size of the three stacks, in elements. */
|
/* Get the current used size of the three stacks, in elements. */
|
||||||
int size = yyssp - yyss + 1;
|
YYSIZE_T yysize = yyssp - yyss + 1;
|
||||||
|
|
||||||
#ifdef yyoverflow
|
#ifdef yyoverflow
|
||||||
/* Each stack pointer address is followed by the size of the
|
{
|
||||||
data in use in that stack, in bytes. */
|
/* Give user a chance to reallocate the stack. Use copies of
|
||||||
# if YYLSP_NEEDED
|
these so that the &'s don't force the real ones into
|
||||||
/* This used to be a conditional around just the two extra args,
|
memory. */
|
||||||
but that might be undefined if yyoverflow is a macro. */
|
YYSTYPE *yyvs1 = yyvs;
|
||||||
yyoverflow ("parser stack overflow",
|
short *yyss1 = yyss;
|
||||||
&yyss1, size * sizeof (*yyssp),
|
|
||||||
&yyvs1, size * sizeof (*yyvsp),
|
|
||||||
&yyls1, size * sizeof (*yylsp),
|
|
||||||
&yystacksize);
|
|
||||||
# else
|
|
||||||
yyoverflow ("parser stack overflow",
|
|
||||||
&yyss1, size * sizeof (*yyssp),
|
|
||||||
&yyvs1, size * sizeof (*yyvsp),
|
|
||||||
&yystacksize);
|
|
||||||
# endif
|
|
||||||
|
|
||||||
yyss = yyss1; yyvs = yyvs1;
|
/* Each stack pointer address is followed by the size of the
|
||||||
|
data in use in that stack, in bytes. */
|
||||||
# if YYLSP_NEEDED
|
# if YYLSP_NEEDED
|
||||||
yyls = yyls1;
|
YYLTYPE *yyls1 = yyls;
|
||||||
|
/* This used to be a conditional around just the two extra args,
|
||||||
|
but that might be undefined if yyoverflow is a macro. */
|
||||||
|
yyoverflow ("parser stack overflow",
|
||||||
|
&yyss1, yysize * sizeof (*yyssp),
|
||||||
|
&yyvs1, yysize * sizeof (*yyvsp),
|
||||||
|
&yyls1, yysize * sizeof (*yylsp),
|
||||||
|
&yystacksize);
|
||||||
|
yyls = yyls1;
|
||||||
|
# else
|
||||||
|
yyoverflow ("parser stack overflow",
|
||||||
|
&yyss1, yysize * sizeof (*yyssp),
|
||||||
|
&yyvs1, yysize * sizeof (*yyvsp),
|
||||||
|
&yystacksize);
|
||||||
# endif
|
# endif
|
||||||
|
yyss = yyss1;
|
||||||
|
yyvs = yyvs1;
|
||||||
|
}
|
||||||
#else /* no yyoverflow */
|
#else /* no yyoverflow */
|
||||||
/* Extend the stack our own way. */
|
/* Extend the stack our own way. */
|
||||||
if (yystacksize >= YYMAXDEPTH)
|
if (yystacksize >= YYMAXDEPTH)
|
||||||
{
|
goto yyoverflowlab;
|
||||||
yyerror ("parser stack overflow");
|
|
||||||
if (yyfree_stacks)
|
|
||||||
{
|
|
||||||
free (yyss);
|
|
||||||
free (yyvs);
|
|
||||||
# if YYLSP_NEEDED
|
|
||||||
free (yyls);
|
|
||||||
# endif
|
|
||||||
}
|
|
||||||
return 2;
|
|
||||||
}
|
|
||||||
yystacksize *= 2;
|
yystacksize *= 2;
|
||||||
if (yystacksize > YYMAXDEPTH)
|
if (yystacksize > YYMAXDEPTH)
|
||||||
yystacksize = YYMAXDEPTH;
|
yystacksize = YYMAXDEPTH;
|
||||||
# if !YYSTACK_USE_ALLOCA
|
|
||||||
yyfree_stacks = 1;
|
{
|
||||||
# endif
|
short *yyss1 = yyss;
|
||||||
yyss = (short *) YYSTACK_ALLOC (yystacksize * sizeof (*yyssp));
|
union yyalloc *yyptr =
|
||||||
__yy_memcpy ((char *)yyss, (char *)yyss1,
|
(union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
|
||||||
size * (unsigned int) sizeof (*yyssp));
|
if (! yyptr)
|
||||||
yyvs = (YYSTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yyvsp));
|
goto yyoverflowlab;
|
||||||
__yy_memcpy ((char *)yyvs, (char *)yyvs1,
|
YYSTACK_RELOCATE (short, yyss);
|
||||||
size * (unsigned int) sizeof (*yyvsp));
|
YYSTACK_RELOCATE (YYSTYPE, yyvs);
|
||||||
# if YYLSP_NEEDED
|
# if YYLSP_NEEDED
|
||||||
yyls = (YYLTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yylsp));
|
YYSTACK_RELOCATE (YYLTYPE, yyls);
|
||||||
__yy_memcpy ((char *)yyls, (char *)yyls1,
|
|
||||||
size * (unsigned int) sizeof (*yylsp));
|
|
||||||
# endif
|
# endif
|
||||||
|
# undef YYSTACK_RELOCATE
|
||||||
|
if (yyss1 != yyssa)
|
||||||
|
YYSTACK_FREE (yyss1);
|
||||||
|
}
|
||||||
#endif /* no yyoverflow */
|
#endif /* no yyoverflow */
|
||||||
|
|
||||||
yyssp = yyss + size - 1;
|
yyssp = yyss + yysize - 1;
|
||||||
yyvsp = yyvs + size - 1;
|
yyvsp = yyvs + yysize - 1;
|
||||||
#if YYLSP_NEEDED
|
#if YYLSP_NEEDED
|
||||||
yylsp = yyls + size - 1;
|
yylsp = yyls + yysize - 1;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
YYDPRINTF ((stderr, "Stack size increased to %d\n", yystacksize));
|
YYDPRINTF ((stderr, "Stack size increased to %lu\n",
|
||||||
|
(unsigned long int) yystacksize));
|
||||||
|
|
||||||
if (yyssp >= yyss + yystacksize - 1)
|
if (yyssp >= yyss + yystacksize - 1)
|
||||||
YYABORT;
|
YYABORT;
|
||||||
@@ -594,14 +692,14 @@ yyreduce:
|
|||||||
are defined only if `YYDEBUG' is set. */
|
are defined only if `YYDEBUG' is set. */
|
||||||
if (yydebug)
|
if (yydebug)
|
||||||
{
|
{
|
||||||
int i;
|
int yyi;
|
||||||
|
|
||||||
fprintf (stderr, "Reducing via rule %d (line %d), ",
|
fprintf (stderr, "Reducing via rule %d (line %d), ",
|
||||||
yyn, yyrline[yyn]);
|
yyn, yyrline[yyn]);
|
||||||
|
|
||||||
/* Print the symbols being reduced, and their result. */
|
/* Print the symbols being reduced, and their result. */
|
||||||
for (i = yyprhs[yyn]; yyrhs[i] > 0; i++)
|
for (yyi = yyprhs[yyn]; yyrhs[yyi] > 0; yyi++)
|
||||||
fprintf (stderr, "%s ", yytname[yyrhs[i]]);
|
fprintf (stderr, "%s ", yytname[yyrhs[yyi]]);
|
||||||
fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]);
|
fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -617,10 +715,10 @@ yyreduce:
|
|||||||
#if YYDEBUG
|
#if YYDEBUG
|
||||||
if (yydebug)
|
if (yydebug)
|
||||||
{
|
{
|
||||||
short *ssp1 = yyss - 1;
|
short *yyssp1 = yyss - 1;
|
||||||
fprintf (stderr, "state stack now");
|
fprintf (stderr, "state stack now");
|
||||||
while (ssp1 != yyssp)
|
while (yyssp1 != yyssp)
|
||||||
fprintf (stderr, " %d", *++ssp1);
|
fprintf (stderr, " %d", *++yyssp1);
|
||||||
fprintf (stderr, "\n");
|
fprintf (stderr, "\n");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -659,46 +757,47 @@ yyerrlab:
|
|||||||
|
|
||||||
if (yyn > YYFLAG && yyn < YYLAST)
|
if (yyn > YYFLAG && yyn < YYLAST)
|
||||||
{
|
{
|
||||||
int size = 0;
|
YYSIZE_T yysize = 0;
|
||||||
char *msg;
|
char *yymsg;
|
||||||
int x, count;
|
int yyx, yycount;
|
||||||
|
|
||||||
count = 0;
|
yycount = 0;
|
||||||
/* Start X at -yyn if nec to avoid negative indexes in yycheck. */
|
/* Start YYX at -YYN if negative to avoid negative indexes in
|
||||||
for (x = (yyn < 0 ? -yyn : 0);
|
YYCHECK. */
|
||||||
x < (int) (sizeof (yytname) / sizeof (char *)); x++)
|
for (yyx = yyn < 0 ? -yyn : 0;
|
||||||
if (yycheck[x + yyn] == x)
|
yyx < (int) (sizeof (yytname) / sizeof (char *)); yyx++)
|
||||||
size += strlen (yytname[x]) + 15, count++;
|
if (yycheck[yyx + yyn] == yyx)
|
||||||
size += strlen ("parse error, unexpected `") + 1;
|
yysize += yystrlen (yytname[yyx]) + 15, yycount++;
|
||||||
size += strlen (yytname[YYTRANSLATE (yychar)]);
|
yysize += yystrlen ("parse error, unexpected ") + 1;
|
||||||
msg = (char *) malloc (size);
|
yysize += yystrlen (yytname[YYTRANSLATE (yychar)]);
|
||||||
if (msg != 0)
|
yymsg = (char *) YYSTACK_ALLOC (yysize);
|
||||||
|
if (yymsg != 0)
|
||||||
{
|
{
|
||||||
strcpy (msg, "parse error, unexpected `");
|
char *yyp = yystpcpy (yymsg, "parse error, unexpected ");
|
||||||
strcat (msg, yytname[YYTRANSLATE (yychar)]);
|
yyp = yystpcpy (yyp, yytname[YYTRANSLATE (yychar)]);
|
||||||
strcat (msg, "'");
|
|
||||||
|
|
||||||
if (count < 5)
|
if (yycount < 5)
|
||||||
{
|
{
|
||||||
count = 0;
|
yycount = 0;
|
||||||
for (x = (yyn < 0 ? -yyn : 0);
|
for (yyx = yyn < 0 ? -yyn : 0;
|
||||||
x < (int) (sizeof (yytname) / sizeof (char *)); x++)
|
yyx < (int) (sizeof (yytname) / sizeof (char *));
|
||||||
if (yycheck[x + yyn] == x)
|
yyx++)
|
||||||
|
if (yycheck[yyx + yyn] == yyx)
|
||||||
{
|
{
|
||||||
strcat (msg, count == 0 ? ", expecting `" : " or `");
|
const char *yyq = ! yycount ? ", expecting " : " or ";
|
||||||
strcat (msg, yytname[x]);
|
yyp = yystpcpy (yyp, yyq);
|
||||||
strcat (msg, "'");
|
yyp = yystpcpy (yyp, yytname[yyx]);
|
||||||
count++;
|
yycount++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
yyerror (msg);
|
yyerror (yymsg);
|
||||||
free (msg);
|
YYSTACK_FREE (yymsg);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
yyerror ("parse error; also virtual memory exceeded");
|
yyerror ("parse error; also virtual memory exhausted");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
#endif /* YYERROR_VERBOSE */
|
#endif /* defined (YYERROR_VERBOSE) */
|
||||||
yyerror ("parse error");
|
yyerror ("parse error");
|
||||||
}
|
}
|
||||||
goto yyerrlab1;
|
goto yyerrlab1;
|
||||||
@@ -761,10 +860,10 @@ yyerrpop:
|
|||||||
#if YYDEBUG
|
#if YYDEBUG
|
||||||
if (yydebug)
|
if (yydebug)
|
||||||
{
|
{
|
||||||
short *ssp1 = yyss - 1;
|
short *yyssp1 = yyss - 1;
|
||||||
fprintf (stderr, "Error: state stack now");
|
fprintf (stderr, "Error: state stack now");
|
||||||
while (ssp1 != yyssp)
|
while (yyssp1 != yyssp)
|
||||||
fprintf (stderr, " %d", *++ssp1);
|
fprintf (stderr, " %d", *++yyssp1);
|
||||||
fprintf (stderr, "\n");
|
fprintf (stderr, "\n");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -810,28 +909,28 @@ yyerrhandle:
|
|||||||
| yyacceptlab -- YYACCEPT comes here. |
|
| yyacceptlab -- YYACCEPT comes here. |
|
||||||
`-------------------------------------*/
|
`-------------------------------------*/
|
||||||
yyacceptlab:
|
yyacceptlab:
|
||||||
if (yyfree_stacks)
|
yyresult = 0;
|
||||||
{
|
goto yyreturn;
|
||||||
free (yyss);
|
|
||||||
free (yyvs);
|
|
||||||
#if YYLSP_NEEDED
|
|
||||||
free (yyls);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
|
|
||||||
/*-----------------------------------.
|
/*-----------------------------------.
|
||||||
| yyabortlab -- YYABORT comes here. |
|
| yyabortlab -- YYABORT comes here. |
|
||||||
`-----------------------------------*/
|
`-----------------------------------*/
|
||||||
yyabortlab:
|
yyabortlab:
|
||||||
if (yyfree_stacks)
|
yyresult = 1;
|
||||||
{
|
goto yyreturn;
|
||||||
free (yyss);
|
|
||||||
free (yyvs);
|
/*---------------------------------------------.
|
||||||
#if YYLSP_NEEDED
|
| yyoverflowab -- parser overflow comes here. |
|
||||||
free (yyls);
|
`---------------------------------------------*/
|
||||||
|
yyoverflowlab:
|
||||||
|
yyerror ("parser stack overflow");
|
||||||
|
yyresult = 2;
|
||||||
|
/* Fall through. */
|
||||||
|
|
||||||
|
yyreturn:
|
||||||
|
#ifndef yyoverflow
|
||||||
|
if (yyss != yyssa)
|
||||||
|
YYSTACK_FREE (yyss);
|
||||||
#endif
|
#endif
|
||||||
}
|
return yyresult;
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|||||||
+99
-160
@@ -1,5 +1,5 @@
|
|||||||
/* Subroutines for bison
|
/* Subroutines for bison
|
||||||
Copyright 1984, 1989, 2000 Free Software Foundation, Inc.
|
Copyright 1984, 1989, 2000, 2001 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of Bison, the GNU Compiler Compiler.
|
This file is part of Bison, the GNU Compiler Compiler.
|
||||||
|
|
||||||
@@ -19,61 +19,69 @@
|
|||||||
02111-1307, USA. */
|
02111-1307, USA. */
|
||||||
|
|
||||||
#include "system.h"
|
#include "system.h"
|
||||||
|
#include "getargs.h"
|
||||||
#include "gram.h"
|
#include "gram.h"
|
||||||
|
#include "reader.h"
|
||||||
#include "closure.h"
|
#include "closure.h"
|
||||||
#include "derives.h"
|
#include "derives.h"
|
||||||
#include "warshall.h"
|
#include "warshall.h"
|
||||||
|
|
||||||
|
/* NITEMSET is the size of the array ITEMSET. */
|
||||||
short *itemset;
|
short *itemset;
|
||||||
short *itemsetend;
|
int nitemset;
|
||||||
|
|
||||||
static unsigned *ruleset;
|
static unsigned *ruleset;
|
||||||
|
|
||||||
/* internal data. See comments before set_fderives and set_firsts. */
|
/* internal data. See comments before set_fderives and set_firsts. */
|
||||||
static unsigned *fderives;
|
static unsigned *fderives;
|
||||||
static unsigned *firsts;
|
static unsigned *firsts;
|
||||||
|
|
||||||
|
/* Retrieve the FDERIVES/FIRSTS sets of the nonterminals numbered Var. */
|
||||||
|
#define FDERIVES(Var) (fderives + ((Var) - ntokens) * rulesetsize)
|
||||||
|
#define FIRSTS(Var) (firsts + ((Var) - ntokens) * varsetsize)
|
||||||
|
|
||||||
/* number of words required to hold a bit for each rule */
|
/* number of words required to hold a bit for each rule */
|
||||||
static int rulesetsize;
|
static int rulesetsize;
|
||||||
|
|
||||||
/* number of words required to hold a bit for each variable */
|
/* number of words required to hold a bit for each variable */
|
||||||
static int varsetsize;
|
static int varsetsize;
|
||||||
|
|
||||||
#if DEBUG
|
|
||||||
|
|
||||||
/*-----------------.
|
/*-----------------.
|
||||||
| Debugging code. |
|
| Debugging code. |
|
||||||
`-----------------*/
|
`-----------------*/
|
||||||
|
|
||||||
static void
|
static void
|
||||||
print_closure (int n)
|
print_closure (const char *title, short *array, size_t size)
|
||||||
{
|
{
|
||||||
short *isp;
|
size_t i;
|
||||||
|
fprintf (stderr, "Closure: %s\n", title);
|
||||||
printf ("\n\nn = %d\n\n", n);
|
for (i = 0; i < size; ++i)
|
||||||
for (isp = itemset; isp < itemsetend; isp++)
|
{
|
||||||
printf (" %d\n", *isp);
|
short *rp;
|
||||||
|
fprintf (stderr, " %2d: .", array[i]);
|
||||||
|
for (rp = &ritem[array[i]]; *rp > 0; ++rp)
|
||||||
|
fprintf (stderr, " %s", tags[*rp]);
|
||||||
|
fprintf (stderr, " (rule %d)\n", -*rp);
|
||||||
|
}
|
||||||
|
fputs ("\n\n", stderr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
print_firsts (void)
|
print_firsts (void)
|
||||||
{
|
{
|
||||||
int i;
|
int i, j;
|
||||||
int j;
|
|
||||||
unsigned *rowp;
|
|
||||||
|
|
||||||
printf ("\n\n\nFIRSTS\n\n");
|
|
||||||
|
|
||||||
|
fprintf (stderr, "FIRSTS\n");
|
||||||
for (i = ntokens; i < nsyms; i++)
|
for (i = ntokens; i < nsyms; i++)
|
||||||
{
|
{
|
||||||
printf ("\n\n%s firsts\n\n", tags[i]);
|
fprintf (stderr, "\t%s firsts\n", tags[i]);
|
||||||
|
|
||||||
rowp = firsts + ((i - ntokens) * varsetsize);
|
|
||||||
|
|
||||||
for (j = 0; j < nvars; j++)
|
for (j = 0; j < nvars; j++)
|
||||||
if (BITISSET (rowp, j))
|
if (BITISSET (FIRSTS (i), j))
|
||||||
printf (" %s\n", tags[j + ntokens]);
|
fprintf (stderr, "\t\t%d (%s)\n", j + ntokens, tags[j + ntokens]);
|
||||||
}
|
}
|
||||||
|
fprintf (stderr, "\n\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -82,23 +90,24 @@ print_fderives (void)
|
|||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
int j;
|
int j;
|
||||||
unsigned *rp;
|
|
||||||
|
|
||||||
printf ("\n\n\nFDERIVES\n");
|
fprintf (stderr, "FDERIVES\n");
|
||||||
|
|
||||||
for (i = ntokens; i < nsyms; i++)
|
for (i = ntokens; i < nsyms; i++)
|
||||||
{
|
{
|
||||||
printf ("\n\n%s derives\n\n", tags[i]);
|
fprintf (stderr, "\t%s derives\n", tags[i]);
|
||||||
rp = fderives + i * rulesetsize;
|
|
||||||
|
|
||||||
for (j = 0; j <= nrules; j++)
|
for (j = 0; j <= nrules; j++)
|
||||||
if (BITISSET (rp, j))
|
if (BITISSET (FDERIVES (i), j))
|
||||||
printf (" %d\n", j);
|
{
|
||||||
|
short *rhsp;
|
||||||
|
fprintf (stderr, "\t\t%d:", j);
|
||||||
|
for (rhsp = ritem + rule_table[j].rhs; *rhsp > 0; ++rhsp)
|
||||||
|
fprintf (stderr, " %s", tags[*rhsp]);
|
||||||
|
fputc ('\n', stderr);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
fprintf (stderr, "\n\n");
|
||||||
fflush (stdout);
|
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
/*-------------------------------------------------------------------.
|
/*-------------------------------------------------------------------.
|
||||||
| Set FIRSTS to be an NVARS by NVARS bit matrix indicating which |
|
| Set FIRSTS to be an NVARS by NVARS bit matrix indicating which |
|
||||||
@@ -113,39 +122,24 @@ print_fderives (void)
|
|||||||
static void
|
static void
|
||||||
set_firsts (void)
|
set_firsts (void)
|
||||||
{
|
{
|
||||||
unsigned *row;
|
int i, j;
|
||||||
int symbol;
|
|
||||||
short *sp;
|
|
||||||
int rowsize;
|
|
||||||
|
|
||||||
int i;
|
varsetsize = WORDSIZE (nvars);
|
||||||
|
|
||||||
varsetsize = rowsize = WORDSIZE (nvars);
|
firsts = XCALLOC (unsigned, nvars * varsetsize);
|
||||||
|
|
||||||
firsts = XCALLOC (unsigned, nvars * rowsize);
|
|
||||||
|
|
||||||
row = firsts;
|
|
||||||
for (i = ntokens; i < nsyms; i++)
|
for (i = ntokens; i < nsyms; i++)
|
||||||
{
|
for (j = 0; derives[i][j] >= 0; ++j)
|
||||||
sp = derives[i];
|
{
|
||||||
while (*sp >= 0)
|
int symbol = ritem[rule_table[derives[i][j]].rhs];
|
||||||
{
|
if (ISVAR (symbol))
|
||||||
symbol = ritem[rrhs[*sp++]];
|
SETBIT (FIRSTS (i), symbol - ntokens);
|
||||||
if (ISVAR (symbol))
|
}
|
||||||
{
|
|
||||||
symbol -= ntokens;
|
|
||||||
SETBIT (row, symbol);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
row += rowsize;
|
|
||||||
}
|
|
||||||
|
|
||||||
RTC (firsts, nvars);
|
RTC (firsts, nvars);
|
||||||
|
|
||||||
#ifdef DEBUG
|
if (trace_flag)
|
||||||
print_firsts ();
|
print_firsts ();
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*-------------------------------------------------------------------.
|
/*-------------------------------------------------------------------.
|
||||||
@@ -161,52 +155,20 @@ set_firsts (void)
|
|||||||
static void
|
static void
|
||||||
set_fderives (void)
|
set_fderives (void)
|
||||||
{
|
{
|
||||||
unsigned *rrow;
|
int i, j, k;
|
||||||
unsigned *vrow;
|
|
||||||
int j;
|
|
||||||
unsigned cword;
|
|
||||||
short *rp;
|
|
||||||
int b;
|
|
||||||
|
|
||||||
int ruleno;
|
fderives = XCALLOC (unsigned, nvars * rulesetsize);
|
||||||
int i;
|
|
||||||
|
|
||||||
fderives = XCALLOC (unsigned, nvars * rulesetsize) - ntokens * rulesetsize;
|
|
||||||
|
|
||||||
set_firsts ();
|
set_firsts ();
|
||||||
|
|
||||||
rrow = fderives + ntokens * rulesetsize;
|
for (i = ntokens; i < nsyms; ++i)
|
||||||
|
for (j = ntokens; j < nsyms; ++j)
|
||||||
|
if (BITISSET (FIRSTS (i), j - ntokens))
|
||||||
|
for (k = 0; derives[j][k] > 0; ++k)
|
||||||
|
SETBIT (FDERIVES (i), derives[j][k]);
|
||||||
|
|
||||||
for (i = ntokens; i < nsyms; i++)
|
if (trace_flag)
|
||||||
{
|
print_fderives ();
|
||||||
vrow = firsts + ((i - ntokens) * varsetsize);
|
|
||||||
cword = *vrow++;
|
|
||||||
b = 0;
|
|
||||||
for (j = ntokens; j < nsyms; j++)
|
|
||||||
{
|
|
||||||
if (cword & (1 << b))
|
|
||||||
{
|
|
||||||
rp = derives[j];
|
|
||||||
while ((ruleno = *rp++) > 0)
|
|
||||||
{
|
|
||||||
SETBIT (rrow, ruleno);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
b++;
|
|
||||||
if (b >= BITS_PER_WORD && j + 1 < nsyms)
|
|
||||||
{
|
|
||||||
cword = *vrow++;
|
|
||||||
b = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
rrow += rulesetsize;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
print_fderives ();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
XFREE (firsts);
|
XFREE (firsts);
|
||||||
}
|
}
|
||||||
@@ -228,82 +190,59 @@ new_closure (int n)
|
|||||||
void
|
void
|
||||||
closure (short *core, int n)
|
closure (short *core, int n)
|
||||||
{
|
{
|
||||||
|
/* Index over CORE. */
|
||||||
|
int c;
|
||||||
|
|
||||||
|
/* Index over RULESET. */
|
||||||
|
int r;
|
||||||
|
|
||||||
|
/* A bit index over RULESET. */
|
||||||
int ruleno;
|
int ruleno;
|
||||||
unsigned word;
|
|
||||||
short *csp;
|
|
||||||
unsigned *dsp;
|
|
||||||
unsigned *rsp;
|
|
||||||
|
|
||||||
short *csend;
|
if (trace_flag)
|
||||||
unsigned *rsend;
|
print_closure ("input", core, n);
|
||||||
int symbol;
|
|
||||||
int itemno;
|
|
||||||
|
|
||||||
rsp = ruleset;
|
|
||||||
rsend = ruleset + rulesetsize;
|
|
||||||
csend = core + n;
|
|
||||||
|
|
||||||
if (n == 0)
|
if (n == 0)
|
||||||
{
|
{
|
||||||
dsp = fderives + start_symbol * rulesetsize;
|
for (r = 0; r < rulesetsize; ++r)
|
||||||
while (rsp < rsend)
|
ruleset[r] = FDERIVES (start_symbol)[r];
|
||||||
*rsp++ = *dsp++;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
while (rsp < rsend)
|
for (r = 0; r < rulesetsize; ++r)
|
||||||
*rsp++ = 0;
|
ruleset[r] = 0;
|
||||||
|
|
||||||
csp = core;
|
for (c = 0; c < n; ++c)
|
||||||
while (csp < csend)
|
if (ISVAR (ritem[core[c]]))
|
||||||
{
|
for (r = 0; r < rulesetsize; ++r)
|
||||||
symbol = ritem[*csp++];
|
ruleset[r] |= FDERIVES (ritem[core[c]])[r];
|
||||||
if (ISVAR (symbol))
|
|
||||||
{
|
|
||||||
dsp = fderives + symbol * rulesetsize;
|
|
||||||
rsp = ruleset;
|
|
||||||
while (rsp < rsend)
|
|
||||||
*rsp++ |= *dsp++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ruleno = 0;
|
nitemset = 0;
|
||||||
itemsetend = itemset;
|
c = 0;
|
||||||
csp = core;
|
for (ruleno = 0; ruleno < rulesetsize * BITS_PER_WORD; ++ruleno)
|
||||||
rsp = ruleset;
|
if (BITISSET (ruleset, ruleno))
|
||||||
while (rsp < rsend)
|
{
|
||||||
|
int itemno = rule_table[ruleno].rhs;
|
||||||
|
while (c < n && core[c] < itemno)
|
||||||
|
{
|
||||||
|
itemset[nitemset] = core[c];
|
||||||
|
nitemset++;
|
||||||
|
c++;
|
||||||
|
}
|
||||||
|
itemset[nitemset] = itemno;
|
||||||
|
nitemset++;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (c < n)
|
||||||
{
|
{
|
||||||
word = *rsp++;
|
itemset[nitemset] = core[c];
|
||||||
if (word == 0)
|
nitemset++;
|
||||||
{
|
c++;
|
||||||
ruleno += BITS_PER_WORD;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
int b;
|
|
||||||
|
|
||||||
for (b = 0; b < BITS_PER_WORD; b++)
|
|
||||||
{
|
|
||||||
if (word & (1 << b))
|
|
||||||
{
|
|
||||||
itemno = rrhs[ruleno];
|
|
||||||
while (csp < csend && *csp < itemno)
|
|
||||||
*itemsetend++ = *csp++;
|
|
||||||
*itemsetend++ = itemno;
|
|
||||||
}
|
|
||||||
|
|
||||||
ruleno++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
while (csp < csend)
|
if (trace_flag)
|
||||||
*itemsetend++ = *csp++;
|
print_closure ("output", itemset, nitemset);
|
||||||
|
|
||||||
#if DEBUG
|
|
||||||
print_closure (n);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -312,5 +251,5 @@ free_closure (void)
|
|||||||
{
|
{
|
||||||
XFREE (itemset);
|
XFREE (itemset);
|
||||||
XFREE (ruleset);
|
XFREE (ruleset);
|
||||||
XFREE (fderives + ntokens * rulesetsize);
|
XFREE (fderives);
|
||||||
}
|
}
|
||||||
|
|||||||
+10
-9
@@ -1,5 +1,5 @@
|
|||||||
/* Subroutines for bison
|
/* Subroutines for bison
|
||||||
Copyright 1984, 1989, 2000 Free Software Foundation, Inc.
|
Copyright 1984, 1989, 2000, 2001 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of Bison, the GNU Compiler Compiler.
|
This file is part of Bison, the GNU Compiler Compiler.
|
||||||
|
|
||||||
@@ -30,18 +30,19 @@
|
|||||||
void new_closure PARAMS ((int n));
|
void new_closure PARAMS ((int n));
|
||||||
|
|
||||||
|
|
||||||
/* Given a vector of item numbers ITEMS, of length N, set up ruleset
|
/* Given the kernel (aka core) of a state (a vector of item numbers
|
||||||
and itemset to indicate what rules could be run and which items
|
ITEMS, of length N), set up ruleset and itemset to indicate what
|
||||||
could be accepted when those items are the active ones.
|
rules could be run and which items could be accepted when those
|
||||||
|
items are the active ones.
|
||||||
|
|
||||||
ruleset contains a bit for each rule. closure sets the bits for
|
ruleset contains a bit for each rule. closure sets the bits for
|
||||||
all rules which could potentially describe the next input to be
|
all rules which could potentially describe the next input to be
|
||||||
read.
|
read.
|
||||||
|
|
||||||
itemset is a vector of item numbers; itemsetend points to just
|
ITEMSET is a vector of item numbers; NITEMSET is its size
|
||||||
beyond the end of the part of it that is significant. closure
|
9actually, points to just beyond the end of the part of it that is
|
||||||
places there the indices of all items which represent units of
|
significant). closure places there the indices of all items which
|
||||||
input that could arrive next. */
|
represent units of input that could arrive next. */
|
||||||
|
|
||||||
void closure PARAMS ((short *items, int n));
|
void closure PARAMS ((short *items, int n));
|
||||||
|
|
||||||
@@ -51,6 +52,6 @@ void closure PARAMS ((short *items, int n));
|
|||||||
void free_closure PARAMS ((void));
|
void free_closure PARAMS ((void));
|
||||||
|
|
||||||
extern short *itemset;
|
extern short *itemset;
|
||||||
extern short *itemsetend;
|
extern int nitemset;
|
||||||
|
|
||||||
#endif /* !CLOSURE_H_ */
|
#endif /* !CLOSURE_H_ */
|
||||||
|
|||||||
+1
-60
@@ -1,5 +1,5 @@
|
|||||||
/* Declaration for error-reporting function for Bison.
|
/* Declaration for error-reporting function for Bison.
|
||||||
Copyright 2000 Free Software Foundation, Inc.
|
Copyright 2000, 2001 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify it
|
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
|
under the terms of the GNU General Public License as published by the
|
||||||
@@ -248,62 +248,3 @@ fatal (message, va_alist)
|
|||||||
fflush (stderr);
|
fflush (stderr);
|
||||||
exit (1);
|
exit (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*------------------------------------------------------------------.
|
|
||||||
| A severe error has occurred, we cannot proceed. Exit with STATUS, |
|
|
||||||
| and report the error message of the errno ERRNUM. |
|
|
||||||
`------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
void
|
|
||||||
#if defined VA_START && defined __STDC__
|
|
||||||
error (int status, int errnum,
|
|
||||||
const char *message, ...)
|
|
||||||
#else
|
|
||||||
error (status, errnum, message, va_alist)
|
|
||||||
int status;
|
|
||||||
int errnum;
|
|
||||||
char *message;
|
|
||||||
va_dcl
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
#ifdef VA_START
|
|
||||||
va_list args;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
fflush (stdout);
|
|
||||||
if (infile != NULL)
|
|
||||||
fprintf (stderr, "%s:%d: ", infile, lineno);
|
|
||||||
else
|
|
||||||
fprintf (stderr, "%s:", program_name);
|
|
||||||
|
|
||||||
fputs (_("fatal error: "), stderr);
|
|
||||||
|
|
||||||
#ifdef VA_START
|
|
||||||
VA_START (args, message);
|
|
||||||
vfprintf (stderr, message, args);
|
|
||||||
va_end (args);
|
|
||||||
#else
|
|
||||||
fprintf (stderr, message, a1, a2, a3, a4, a5, a6, a7, a8);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (errnum)
|
|
||||||
{
|
|
||||||
#if defined HAVE_STRERROR_R || _LIBC
|
|
||||||
char errbuf[1024];
|
|
||||||
# if HAVE_WORKING_STRERROR_R || _LIBC
|
|
||||||
fprintf (stderr, ": %s", __strerror_r (errnum, errbuf, sizeof errbuf));
|
|
||||||
# else
|
|
||||||
/* Don't use __strerror_r's return value because on some systems
|
|
||||||
(at least DEC UNIX 4.0[A-D]) strerror_r returns `int'. */
|
|
||||||
__strerror_r (errnum, errbuf, sizeof errbuf);
|
|
||||||
fprintf (stderr, ": %s", errbuf);
|
|
||||||
# endif
|
|
||||||
#else
|
|
||||||
fprintf (stderr, ": %s", strerror (errnum));
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
putc ('\n', stderr);
|
|
||||||
fflush (stderr);
|
|
||||||
if (status)
|
|
||||||
exit (status);
|
|
||||||
}
|
|
||||||
|
|||||||
+2
-10
@@ -1,5 +1,5 @@
|
|||||||
/* Declaration for error-reporting function for Bison.
|
/* Declaration for error-reporting function for Bison.
|
||||||
Copyright 2000 Free Software Foundation, Inc.
|
Copyright 2000, 2001 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify it
|
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
|
under the terms of the GNU General Public License as published by the
|
||||||
@@ -40,18 +40,10 @@ extern void complain (const char *format, ...)
|
|||||||
extern void fatal (const char *format, ...)
|
extern void fatal (const char *format, ...)
|
||||||
__attribute__ ((__format__ (__printf__, 1, 2)));
|
__attribute__ ((__format__ (__printf__, 1, 2)));
|
||||||
|
|
||||||
/* Print a message with `fprintf (stderr, FORMAT, ...)';
|
|
||||||
if ERRNUM is nonzero, follow it with ": " and strerror (ERRNUM).
|
|
||||||
If STATUS is nonzero, terminate the program with `exit (STATUS)'. */
|
|
||||||
|
|
||||||
extern void error (int status, int errnum,
|
|
||||||
const char *format, ...)
|
|
||||||
__attribute__ ((__format__ (__printf__, 3, 4)));
|
|
||||||
|
|
||||||
#else
|
#else
|
||||||
void warn ();
|
void warn ();
|
||||||
void complain ();
|
void complain ();
|
||||||
void error ();
|
void fatal ();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Position in the current input file. */
|
/* Position in the current input file. */
|
||||||
|
|||||||
+246
-434
@@ -19,6 +19,7 @@
|
|||||||
02111-1307, USA. */
|
02111-1307, USA. */
|
||||||
|
|
||||||
#include "system.h"
|
#include "system.h"
|
||||||
|
#include "complain.h"
|
||||||
#include "getargs.h"
|
#include "getargs.h"
|
||||||
#include "files.h"
|
#include "files.h"
|
||||||
#include "gram.h"
|
#include "gram.h"
|
||||||
@@ -28,17 +29,12 @@
|
|||||||
#include "reader.h"
|
#include "reader.h"
|
||||||
#include "LR0.h"
|
#include "LR0.h"
|
||||||
|
|
||||||
int any_conflicts = 0;
|
/* -1 stands for not specified. */
|
||||||
errs **err_table = NULL;
|
int expected_conflicts = -1;
|
||||||
int expected_conflicts;
|
|
||||||
static char *conflicts = NULL;
|
static char *conflicts = NULL;
|
||||||
|
|
||||||
static unsigned *shiftset = NULL;
|
static unsigned *shiftset = NULL;
|
||||||
static unsigned *lookaheadset = NULL;
|
static unsigned *lookaheadset = NULL;
|
||||||
static int src_total;
|
|
||||||
static int rrc_total;
|
|
||||||
static int src_count;
|
|
||||||
static int rrc_count;
|
|
||||||
|
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
@@ -60,21 +56,12 @@ Conflict in state %d between rule %d and token %s resolved as %s.\n"),
|
|||||||
static void
|
static void
|
||||||
flush_shift (int state, int token)
|
flush_shift (int state, int token)
|
||||||
{
|
{
|
||||||
shifts *shiftp;
|
shifts *shiftp = state_table[state].shifts;
|
||||||
int k, i;
|
int i;
|
||||||
|
|
||||||
shiftp = shift_table[state];
|
for (i = 0; i < shiftp->nshifts; i++)
|
||||||
|
if (!SHIFT_IS_DISABLED (shiftp, i) && SHIFT_SYMBOL (shiftp, i) == token)
|
||||||
if (shiftp)
|
SHIFT_DISABLE (shiftp, i);
|
||||||
{
|
|
||||||
k = shiftp->nshifts;
|
|
||||||
for (i = 0; i < k; i++)
|
|
||||||
{
|
|
||||||
if (shiftp->shifts[i]
|
|
||||||
&& token == accessing_symbol[shiftp->shifts[i]])
|
|
||||||
(shiftp->shifts[i]) = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -89,95 +76,79 @@ static void
|
|||||||
resolve_sr_conflict (int state, int lookaheadnum)
|
resolve_sr_conflict (int state, int lookaheadnum)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
int mask;
|
/* find the rule to reduce by to get precedence of reduction */
|
||||||
unsigned *fp1;
|
int redprec = rule_table[LAruleno[lookaheadnum]].prec;
|
||||||
unsigned *fp2;
|
errs *errp = ERRS_ALLOC (ntokens + 1);
|
||||||
int redprec;
|
|
||||||
errs *errp = (errs *) xcalloc (sizeof (errs) + ntokens * sizeof (short), 1);
|
|
||||||
short *errtokens = errp->errs;
|
short *errtokens = errp->errs;
|
||||||
|
|
||||||
/* find the rule to reduce by to get precedence of reduction */
|
|
||||||
redprec = rprec[LAruleno[lookaheadnum]];
|
|
||||||
|
|
||||||
mask = 1;
|
|
||||||
fp1 = LA + lookaheadnum * tokensetsize;
|
|
||||||
fp2 = lookaheadset;
|
|
||||||
for (i = 0; i < ntokens; i++)
|
for (i = 0; i < ntokens; i++)
|
||||||
{
|
if (BITISSET (LA (lookaheadnum), i)
|
||||||
if ((mask & *fp2 & *fp1) && sprec[i])
|
&& BITISSET (lookaheadset, i)
|
||||||
/* Shift-reduce conflict occurs for token number i
|
&& sprec[i])
|
||||||
and it has a precedence.
|
/* Shift-reduce conflict occurs for token number i
|
||||||
The precedence of shifting is that of token i. */
|
and it has a precedence.
|
||||||
{
|
The precedence of shifting is that of token i. */
|
||||||
if (sprec[i] < redprec)
|
{
|
||||||
{
|
if (sprec[i] < redprec)
|
||||||
log_resolution (state, lookaheadnum, i, _("reduce"));
|
{
|
||||||
*fp2 &= ~mask; /* flush the shift for this token */
|
log_resolution (state, lookaheadnum, i, _("reduce"));
|
||||||
flush_shift (state, i);
|
/* flush the shift for this token */
|
||||||
}
|
RESETBIT (lookaheadset, i);
|
||||||
else if (sprec[i] > redprec)
|
flush_shift (state, i);
|
||||||
{
|
}
|
||||||
log_resolution (state, lookaheadnum, i, _("shift"));
|
else if (sprec[i] > redprec)
|
||||||
*fp1 &= ~mask; /* flush the reduce for this token */
|
{
|
||||||
}
|
log_resolution (state, lookaheadnum, i, _("shift"));
|
||||||
else
|
/* flush the reduce for this token */
|
||||||
{
|
RESETBIT (LA (lookaheadnum), i);
|
||||||
/* Matching precedence levels.
|
}
|
||||||
For left association, keep only the reduction.
|
else
|
||||||
For right association, keep only the shift.
|
{
|
||||||
For nonassociation, keep neither. */
|
/* Matching precedence levels.
|
||||||
|
For left association, keep only the reduction.
|
||||||
|
For right association, keep only the shift.
|
||||||
|
For nonassociation, keep neither. */
|
||||||
|
|
||||||
switch (sassoc[i])
|
switch (sassoc[i])
|
||||||
{
|
{
|
||||||
case right_assoc:
|
case right_assoc:
|
||||||
log_resolution (state, lookaheadnum, i, _("shift"));
|
log_resolution (state, lookaheadnum, i, _("shift"));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case left_assoc:
|
case left_assoc:
|
||||||
log_resolution (state, lookaheadnum, i, _("reduce"));
|
log_resolution (state, lookaheadnum, i, _("reduce"));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case non_assoc:
|
case non_assoc:
|
||||||
log_resolution (state, lookaheadnum, i, _("an error"));
|
log_resolution (state, lookaheadnum, i, _("an error"));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sassoc[i] != right_assoc)
|
if (sassoc[i] != right_assoc)
|
||||||
{
|
{
|
||||||
*fp2 &= ~mask; /* flush the shift for this token */
|
/* flush the shift for this token */
|
||||||
flush_shift (state, i);
|
RESETBIT (lookaheadset, i);
|
||||||
}
|
flush_shift (state, i);
|
||||||
if (sassoc[i] != left_assoc)
|
}
|
||||||
{
|
if (sassoc[i] != left_assoc)
|
||||||
*fp1 &= ~mask; /* flush the reduce for this token */
|
{
|
||||||
}
|
/* flush the reduce for this token */
|
||||||
if (sassoc[i] == non_assoc)
|
RESETBIT (LA (lookaheadnum), i);
|
||||||
{
|
}
|
||||||
/* Record an explicit error for this token. */
|
if (sassoc[i] == non_assoc)
|
||||||
*errtokens++ = i;
|
{
|
||||||
}
|
/* Record an explicit error for this token. */
|
||||||
}
|
*errtokens++ = i;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
mask <<= 1;
|
|
||||||
if (mask == 0)
|
|
||||||
{
|
|
||||||
mask = 1;
|
|
||||||
fp2++;
|
|
||||||
fp1++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
errp->nerrs = errtokens - errp->errs;
|
errp->nerrs = errtokens - errp->errs;
|
||||||
if (errp->nerrs)
|
/* Some tokens have been explicitly made errors. Allocate a
|
||||||
{
|
permanent errs structure for this state, to record them. */
|
||||||
/* Some tokens have been explicitly made errors. Allocate
|
i = (char *) errtokens - (char *) errp;
|
||||||
a permanent errs structure for this state, to record them. */
|
state_table[state].errs = ERRS_ALLOC (i + 1);
|
||||||
i = (char *) errtokens - (char *) errp;
|
memcpy (state_table[state].errs, errp, i);
|
||||||
err_table[state] = (errs *) xcalloc ((unsigned int) i, 1);
|
|
||||||
bcopy (errp, err_table[state], i);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
err_table[state] = 0;
|
|
||||||
free (errp);
|
free (errp);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -185,80 +156,47 @@ resolve_sr_conflict (int state, int lookaheadnum)
|
|||||||
static void
|
static void
|
||||||
set_conflicts (int state)
|
set_conflicts (int state)
|
||||||
{
|
{
|
||||||
int i;
|
int i, j;
|
||||||
int k;
|
|
||||||
shifts *shiftp;
|
shifts *shiftp;
|
||||||
unsigned *fp2;
|
|
||||||
unsigned *fp3;
|
|
||||||
unsigned *fp4;
|
|
||||||
unsigned *fp1;
|
|
||||||
int symbol;
|
|
||||||
|
|
||||||
if (consistent[state])
|
if (state_table[state].consistent)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
for (i = 0; i < tokensetsize; i++)
|
for (i = 0; i < tokensetsize; i++)
|
||||||
lookaheadset[i] = 0;
|
lookaheadset[i] = 0;
|
||||||
|
|
||||||
shiftp = shift_table[state];
|
shiftp = state_table[state].shifts;
|
||||||
if (shiftp)
|
for (i = 0; i < shiftp->nshifts && SHIFT_IS_SHIFT (shiftp, i); i++)
|
||||||
{
|
if (!SHIFT_IS_DISABLED (shiftp, i))
|
||||||
k = shiftp->nshifts;
|
SETBIT (lookaheadset, SHIFT_SYMBOL (shiftp, i));
|
||||||
for (i = 0; i < k; i++)
|
|
||||||
{
|
|
||||||
symbol = accessing_symbol[shiftp->shifts[i]];
|
|
||||||
if (ISVAR (symbol))
|
|
||||||
break;
|
|
||||||
SETBIT (lookaheadset, symbol);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
k = lookaheads[state + 1];
|
|
||||||
fp4 = lookaheadset + tokensetsize;
|
|
||||||
|
|
||||||
/* Loop over all rules which require lookahead in this state. First
|
/* Loop over all rules which require lookahead in this state. First
|
||||||
check for shift-reduce conflict, and try to resolve using
|
check for shift-reduce conflict, and try to resolve using
|
||||||
precedence */
|
precedence */
|
||||||
for (i = lookaheads[state]; i < k; i++)
|
for (i = state_table[state].lookaheads;
|
||||||
if (rprec[LAruleno[i]])
|
i < state_table[state + 1].lookaheads;
|
||||||
{
|
++i)
|
||||||
fp1 = LA + i * tokensetsize;
|
if (rule_table[LAruleno[i]].prec)
|
||||||
fp2 = fp1;
|
for (j = 0; j < tokensetsize; ++j)
|
||||||
fp3 = lookaheadset;
|
if (LA (i)[j] & lookaheadset[j])
|
||||||
|
|
||||||
while (fp3 < fp4)
|
|
||||||
{
|
{
|
||||||
if (*fp2++ & *fp3++)
|
resolve_sr_conflict (state, i);
|
||||||
{
|
break;
|
||||||
resolve_sr_conflict (state, i);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Loop over all rules which require lookahead in this state. Check
|
/* Loop over all rules which require lookahead in this state. Check
|
||||||
for conflicts not resolved above. */
|
for conflicts not resolved above. */
|
||||||
for (i = lookaheads[state]; i < k; i++)
|
for (i = state_table[state].lookaheads;
|
||||||
|
i < state_table[state + 1].lookaheads;
|
||||||
|
++i)
|
||||||
{
|
{
|
||||||
fp1 = LA + i * tokensetsize;
|
for (j = 0; j < tokensetsize; ++j)
|
||||||
fp2 = fp1;
|
if (LA (i)[j] & lookaheadset[j])
|
||||||
fp3 = lookaheadset;
|
conflicts[state] = 1;
|
||||||
|
|
||||||
while (fp3 < fp4)
|
for (j = 0; j < tokensetsize; ++j)
|
||||||
{
|
lookaheadset[j] |= LA (i)[j];
|
||||||
if (*fp2++ & *fp3++)
|
|
||||||
{
|
|
||||||
conflicts[state] = 1;
|
|
||||||
any_conflicts = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fp2 = fp1;
|
|
||||||
fp3 = lookaheadset;
|
|
||||||
|
|
||||||
while (fp3 < fp4)
|
|
||||||
*fp3++ |= *fp2++;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -271,10 +209,6 @@ solve_conflicts (void)
|
|||||||
shiftset = XCALLOC (unsigned, tokensetsize);
|
shiftset = XCALLOC (unsigned, tokensetsize);
|
||||||
lookaheadset = XCALLOC (unsigned, tokensetsize);
|
lookaheadset = XCALLOC (unsigned, tokensetsize);
|
||||||
|
|
||||||
err_table = XCALLOC (errs *, nstates);
|
|
||||||
|
|
||||||
any_conflicts = 0;
|
|
||||||
|
|
||||||
for (i = 0; i < nstates; i++)
|
for (i = 0; i < nstates; i++)
|
||||||
set_conflicts (i);
|
set_conflicts (i);
|
||||||
}
|
}
|
||||||
@@ -284,23 +218,15 @@ solve_conflicts (void)
|
|||||||
| Count the number of shift/reduce conflicts. |
|
| Count the number of shift/reduce conflicts. |
|
||||||
`---------------------------------------------*/
|
`---------------------------------------------*/
|
||||||
|
|
||||||
static void
|
static int
|
||||||
count_sr_conflicts (int state)
|
count_sr_conflicts (int state)
|
||||||
{
|
{
|
||||||
int i;
|
int i, k;
|
||||||
int k;
|
int src_count = 0;
|
||||||
int mask;
|
shifts *shiftp = state_table[state].shifts;
|
||||||
shifts *shiftp;
|
|
||||||
unsigned *fp1;
|
|
||||||
unsigned *fp2;
|
|
||||||
unsigned *fp3;
|
|
||||||
int symbol;
|
|
||||||
|
|
||||||
src_count = 0;
|
|
||||||
|
|
||||||
shiftp = shift_table[state];
|
|
||||||
if (!shiftp)
|
if (!shiftp)
|
||||||
return;
|
return 0;
|
||||||
|
|
||||||
for (i = 0; i < tokensetsize; i++)
|
for (i = 0; i < tokensetsize; i++)
|
||||||
{
|
{
|
||||||
@@ -308,49 +234,24 @@ count_sr_conflicts (int state)
|
|||||||
lookaheadset[i] = 0;
|
lookaheadset[i] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
k = shiftp->nshifts;
|
for (i = 0; i < shiftp->nshifts && SHIFT_IS_SHIFT (shiftp, i); i++)
|
||||||
for (i = 0; i < k; i++)
|
if (!SHIFT_IS_DISABLED (shiftp, i))
|
||||||
{
|
SETBIT (shiftset, SHIFT_SYMBOL (shiftp, i));
|
||||||
if (!shiftp->shifts[i])
|
|
||||||
continue;
|
|
||||||
symbol = accessing_symbol[shiftp->shifts[i]];
|
|
||||||
if (ISVAR (symbol))
|
|
||||||
break;
|
|
||||||
SETBIT (shiftset, symbol);
|
|
||||||
}
|
|
||||||
|
|
||||||
k = lookaheads[state + 1];
|
for (i = state_table[state].lookaheads;
|
||||||
fp3 = lookaheadset + tokensetsize;
|
i < state_table[state + 1].lookaheads;
|
||||||
|
++i)
|
||||||
|
for (k = 0; k < tokensetsize; ++k)
|
||||||
|
lookaheadset[k] |= LA (i)[k];
|
||||||
|
|
||||||
for (i = lookaheads[state]; i < k; i++)
|
for (k = 0; k < tokensetsize; ++k)
|
||||||
{
|
lookaheadset[k] &= shiftset[k];
|
||||||
fp1 = LA + i * tokensetsize;
|
|
||||||
fp2 = lookaheadset;
|
|
||||||
|
|
||||||
while (fp2 < fp3)
|
|
||||||
*fp2++ |= *fp1++;
|
|
||||||
}
|
|
||||||
|
|
||||||
fp1 = shiftset;
|
|
||||||
fp2 = lookaheadset;
|
|
||||||
|
|
||||||
while (fp2 < fp3)
|
|
||||||
*fp2++ &= *fp1++;
|
|
||||||
|
|
||||||
mask = 1;
|
|
||||||
fp2 = lookaheadset;
|
|
||||||
for (i = 0; i < ntokens; i++)
|
for (i = 0; i < ntokens; i++)
|
||||||
{
|
if (BITISSET (lookaheadset, i))
|
||||||
if (mask & *fp2)
|
src_count++;
|
||||||
src_count++;
|
|
||||||
|
|
||||||
mask <<= 1;
|
return src_count;
|
||||||
if (mask == 0)
|
|
||||||
{
|
|
||||||
mask = 1;
|
|
||||||
fp2++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -358,51 +259,31 @@ count_sr_conflicts (int state)
|
|||||||
| Count the number of reduce/reduce conflicts. |
|
| Count the number of reduce/reduce conflicts. |
|
||||||
`----------------------------------------------*/
|
`----------------------------------------------*/
|
||||||
|
|
||||||
static void
|
static int
|
||||||
count_rr_conflicts (int state)
|
count_rr_conflicts (int state)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
int j;
|
int rrc_count = 0;
|
||||||
int count;
|
|
||||||
unsigned mask;
|
|
||||||
unsigned *baseword;
|
|
||||||
unsigned *wordp;
|
|
||||||
int m;
|
|
||||||
int n;
|
|
||||||
|
|
||||||
rrc_count = 0;
|
int m = state_table[state].lookaheads;
|
||||||
|
int n = state_table[state + 1].lookaheads;
|
||||||
m = lookaheads[state];
|
|
||||||
n = lookaheads[state + 1];
|
|
||||||
|
|
||||||
if (n - m < 2)
|
if (n - m < 2)
|
||||||
return;
|
return 0;
|
||||||
|
|
||||||
mask = 1;
|
|
||||||
baseword = LA + m * tokensetsize;
|
|
||||||
for (i = 0; i < ntokens; i++)
|
for (i = 0; i < ntokens; i++)
|
||||||
{
|
{
|
||||||
wordp = baseword;
|
int count = 0;
|
||||||
|
int j;
|
||||||
count = 0;
|
|
||||||
for (j = m; j < n; j++)
|
for (j = m; j < n; j++)
|
||||||
{
|
if (BITISSET (LA (m), j))
|
||||||
if (mask & *wordp)
|
count++;
|
||||||
count++;
|
|
||||||
|
|
||||||
wordp += tokensetsize;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (count >= 2)
|
if (count >= 2)
|
||||||
rrc_count++;
|
rrc_count++;
|
||||||
|
|
||||||
mask <<= 1;
|
|
||||||
if (mask == 0)
|
|
||||||
{
|
|
||||||
mask = 1;
|
|
||||||
baseword++;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return rrc_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*--------------------------------------------------------------.
|
/*--------------------------------------------------------------.
|
||||||
@@ -416,31 +297,23 @@ conflict_report (int src_num, int rrc_num)
|
|||||||
static char res[4096];
|
static char res[4096];
|
||||||
char *cp = res;
|
char *cp = res;
|
||||||
|
|
||||||
if (src_num == 1)
|
if (src_num >= 1)
|
||||||
{
|
{
|
||||||
sprintf (cp, _(" 1 shift/reduce conflict"));
|
sprintf (cp, ngettext ("%d shift/reduce conflict",
|
||||||
cp += strlen (cp);
|
"%d shift/reduce conflicts", src_num), src_num);
|
||||||
}
|
|
||||||
else if (src_num > 1)
|
|
||||||
{
|
|
||||||
sprintf (cp, _(" %d shift/reduce conflicts"), src_num);
|
|
||||||
cp += strlen (cp);
|
cp += strlen (cp);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (src_num > 0 && rrc_num > 0)
|
if (src_num > 0 && rrc_num > 0)
|
||||||
{
|
{
|
||||||
sprintf (cp, _(" and"));
|
sprintf (cp, " %s ", _("and"));
|
||||||
cp += strlen (cp);
|
cp += strlen (cp);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rrc_num == 1)
|
if (rrc_num >= 1)
|
||||||
{
|
{
|
||||||
sprintf (cp, _(" 1 reduce/reduce conflict"));
|
sprintf (cp, ngettext ("%d reduce/reduce conflict",
|
||||||
cp += strlen (cp);
|
"%d reduce/reduce conflicts", rrc_num), rrc_num);
|
||||||
}
|
|
||||||
else if (rrc_num > 1)
|
|
||||||
{
|
|
||||||
sprintf (cp, _(" %d reduce/reduce conflicts"), rrc_num);
|
|
||||||
cp += strlen (cp);
|
cp += strlen (cp);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -452,36 +325,59 @@ conflict_report (int src_num, int rrc_num)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*---------------------------------------------.
|
/*-----------------------------------------------------------.
|
||||||
| Compute and give a report on the conflicts. |
|
| Output the detailed description of states with conflicts. |
|
||||||
`---------------------------------------------*/
|
`-----------------------------------------------------------*/
|
||||||
|
|
||||||
void
|
void
|
||||||
print_conflicts (FILE *out)
|
conflicts_output (FILE *out)
|
||||||
|
{
|
||||||
|
bool printed_sth = FALSE;
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < nstates; i++)
|
||||||
|
if (conflicts[i])
|
||||||
|
{
|
||||||
|
fprintf (out, _("State %d contains "), i);
|
||||||
|
fputs (conflict_report (count_sr_conflicts (i),
|
||||||
|
count_rr_conflicts (i)), out);
|
||||||
|
printed_sth = TRUE;
|
||||||
|
}
|
||||||
|
if (printed_sth)
|
||||||
|
fputs ("\n\n", out);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------.
|
||||||
|
| Reporting the total number of conflicts. |
|
||||||
|
`------------------------------------------*/
|
||||||
|
|
||||||
|
void
|
||||||
|
conflicts_print (void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
src_total = 0;
|
/* Is the number of SR conflicts OK? Either EXPECTED_CONFLICTS is
|
||||||
rrc_total = 0;
|
not set, and then we want 0 SR, or else it is specified, in which
|
||||||
|
case we want equality. */
|
||||||
|
int src_ok = 0;
|
||||||
|
|
||||||
/* Count the total number of conflicts, and if wanted, give a
|
int src_total = 0;
|
||||||
detailed report in FOUTPUT. */
|
int rrc_total = 0;
|
||||||
|
|
||||||
|
/* Conflicts by state. */
|
||||||
for (i = 0; i < nstates; i++)
|
for (i = 0; i < nstates; i++)
|
||||||
{
|
if (conflicts[i])
|
||||||
if (conflicts[i])
|
{
|
||||||
{
|
src_total += count_sr_conflicts (i);
|
||||||
count_sr_conflicts (i);
|
rrc_total += count_rr_conflicts (i);
|
||||||
count_rr_conflicts (i);
|
}
|
||||||
src_total += src_count;
|
|
||||||
rrc_total += rrc_count;
|
|
||||||
|
|
||||||
if (verbose_flag)
|
src_ok = src_total == (expected_conflicts == -1 ? 0 : expected_conflicts);
|
||||||
{
|
|
||||||
fprintf (out, _("State %d contains"), i);
|
/* If there are no RR conflicts, and as many SR conflicts as
|
||||||
fputs (conflict_report (src_count, rrc_count), out);
|
expected, then there is nothing to report. */
|
||||||
}
|
if (!rrc_total && src_ok)
|
||||||
}
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
/* Report the total number of conflicts on STDERR. */
|
/* Report the total number of conflicts on STDERR. */
|
||||||
if (yacc_flag)
|
if (yacc_flag)
|
||||||
@@ -499,31 +395,28 @@ print_conflicts (FILE *out)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
fprintf (stderr, _("%s contains"), infile);
|
fprintf (stderr, _("%s contains "), infile);
|
||||||
fputs (conflict_report (src_total, rrc_total), stderr);
|
fputs (conflict_report (src_total, rrc_total), stderr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (expected_conflicts != -1 && !src_ok)
|
||||||
|
{
|
||||||
|
complain_message_count++;
|
||||||
|
fprintf (stderr, ngettext ("expected %d shift/reduce conflict\n",
|
||||||
|
"expected %d shift/reduce conflicts\n",
|
||||||
|
expected_conflicts),
|
||||||
|
expected_conflicts);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
print_reductions (int state)
|
print_reductions (FILE *out, int state)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
int j;
|
int j;
|
||||||
int k;
|
|
||||||
unsigned *fp1;
|
|
||||||
unsigned *fp2;
|
|
||||||
unsigned *fp3;
|
|
||||||
unsigned *fp4;
|
|
||||||
int rule;
|
|
||||||
int symbol;
|
|
||||||
unsigned mask;
|
|
||||||
int m;
|
int m;
|
||||||
int n;
|
int n;
|
||||||
int default_LA;
|
|
||||||
int default_rule = 0;
|
|
||||||
int cmax;
|
|
||||||
int count;
|
|
||||||
shifts *shiftp;
|
shifts *shiftp;
|
||||||
errs *errp;
|
errs *errp;
|
||||||
int nodefault = 0;
|
int nodefault = 0;
|
||||||
@@ -531,106 +424,62 @@ print_reductions (int state)
|
|||||||
for (i = 0; i < tokensetsize; i++)
|
for (i = 0; i < tokensetsize; i++)
|
||||||
shiftset[i] = 0;
|
shiftset[i] = 0;
|
||||||
|
|
||||||
shiftp = shift_table[state];
|
shiftp = state_table[state].shifts;
|
||||||
if (shiftp)
|
for (i = 0; i < shiftp->nshifts && SHIFT_IS_SHIFT (shiftp, i); i++)
|
||||||
{
|
if (!SHIFT_IS_DISABLED (shiftp, i))
|
||||||
k = shiftp->nshifts;
|
{
|
||||||
for (i = 0; i < k; i++)
|
/* if this state has a shift for the error token, don't use a
|
||||||
{
|
default rule. */
|
||||||
if (!shiftp->shifts[i])
|
if (SHIFT_IS_ERROR (shiftp, i))
|
||||||
continue;
|
nodefault = 1;
|
||||||
symbol = accessing_symbol[shiftp->shifts[i]];
|
SETBIT (shiftset, SHIFT_SYMBOL (shiftp, i));
|
||||||
if (ISVAR (symbol))
|
}
|
||||||
break;
|
|
||||||
/* if this state has a shift for the error token,
|
|
||||||
don't use a default rule. */
|
|
||||||
if (symbol == error_token_number)
|
|
||||||
nodefault = 1;
|
|
||||||
SETBIT (shiftset, symbol);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
errp = err_table[state];
|
errp = state_table[state].errs;
|
||||||
if (errp)
|
if (errp)
|
||||||
{
|
for (i = 0; i < errp->nerrs; i++)
|
||||||
k = errp->nerrs;
|
if (errp->errs[i])
|
||||||
for (i = 0; i < k; i++)
|
SETBIT (shiftset, errp->errs[i]);
|
||||||
{
|
|
||||||
if (!errp->errs[i])
|
|
||||||
continue;
|
|
||||||
symbol = errp->errs[i];
|
|
||||||
SETBIT (shiftset, symbol);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
m = lookaheads[state];
|
m = state_table[state].lookaheads;
|
||||||
n = lookaheads[state + 1];
|
n = state_table[state + 1].lookaheads;
|
||||||
|
|
||||||
if (n - m == 1 && !nodefault)
|
if (n - m == 1 && !nodefault)
|
||||||
{
|
{
|
||||||
default_rule = LAruleno[m];
|
int k;
|
||||||
|
int default_rule = LAruleno[m];
|
||||||
|
|
||||||
fp1 = LA + m * tokensetsize;
|
for (k = 0; k < tokensetsize; ++k)
|
||||||
fp2 = shiftset;
|
lookaheadset[k] = LA (m)[k] & shiftset[k];
|
||||||
fp3 = lookaheadset;
|
|
||||||
fp4 = lookaheadset + tokensetsize;
|
|
||||||
|
|
||||||
while (fp3 < fp4)
|
|
||||||
*fp3++ = *fp1++ & *fp2++;
|
|
||||||
|
|
||||||
mask = 1;
|
|
||||||
fp3 = lookaheadset;
|
|
||||||
|
|
||||||
for (i = 0; i < ntokens; i++)
|
for (i = 0; i < ntokens; i++)
|
||||||
{
|
if (BITISSET (lookaheadset, i))
|
||||||
if (mask & *fp3)
|
fprintf (out, _(" %-4s\t[reduce using rule %d (%s)]\n"),
|
||||||
obstack_fgrow3 (&output_obstack,
|
tags[i], default_rule,
|
||||||
_(" %-4s\t[reduce using rule %d (%s)]\n"),
|
tags[rule_table[default_rule].lhs]);
|
||||||
tags[i], default_rule, tags[rlhs[default_rule]]);
|
|
||||||
|
|
||||||
mask <<= 1;
|
fprintf (out, _(" $default\treduce using rule %d (%s)\n\n"),
|
||||||
if (mask == 0)
|
default_rule, tags[rule_table[default_rule].lhs]);
|
||||||
{
|
|
||||||
mask = 1;
|
|
||||||
fp3++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
obstack_fgrow2 (&output_obstack,
|
|
||||||
_(" $default\treduce using rule %d (%s)\n\n"),
|
|
||||||
default_rule, tags[rlhs[default_rule]]);
|
|
||||||
}
|
}
|
||||||
else if (n - m >= 1)
|
else if (n - m >= 1)
|
||||||
{
|
{
|
||||||
cmax = 0;
|
int k;
|
||||||
default_LA = -1;
|
|
||||||
fp4 = lookaheadset + tokensetsize;
|
int cmax = 0;
|
||||||
|
int default_LA = -1;
|
||||||
|
int default_rule = 0;
|
||||||
|
|
||||||
if (!nodefault)
|
if (!nodefault)
|
||||||
for (i = m; i < n; i++)
|
for (i = m; i < n; i++)
|
||||||
{
|
{
|
||||||
fp1 = LA + i * tokensetsize;
|
int count = 0;
|
||||||
fp2 = shiftset;
|
|
||||||
fp3 = lookaheadset;
|
|
||||||
|
|
||||||
while (fp3 < fp4)
|
for (k = 0; k < tokensetsize; ++k)
|
||||||
*fp3++ = *fp1++ & (~(*fp2++));
|
lookaheadset[k] = LA (i)[k] & ~shiftset[k];
|
||||||
|
|
||||||
count = 0;
|
|
||||||
mask = 1;
|
|
||||||
fp3 = lookaheadset;
|
|
||||||
for (j = 0; j < ntokens; j++)
|
for (j = 0; j < ntokens; j++)
|
||||||
{
|
if (BITISSET (lookaheadset, j))
|
||||||
if (mask & *fp3)
|
count++;
|
||||||
count++;
|
|
||||||
|
|
||||||
mask <<= 1;
|
|
||||||
if (mask == 0)
|
|
||||||
{
|
|
||||||
mask = 1;
|
|
||||||
fp3++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (count > cmax)
|
if (count > cmax)
|
||||||
{
|
{
|
||||||
@@ -639,56 +488,34 @@ print_reductions (int state)
|
|||||||
default_rule = LAruleno[i];
|
default_rule = LAruleno[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
fp2 = shiftset;
|
for (k = 0; k < tokensetsize; ++k)
|
||||||
fp3 = lookaheadset;
|
shiftset[k] |= lookaheadset[k];
|
||||||
|
|
||||||
while (fp3 < fp4)
|
|
||||||
*fp2++ |= *fp3++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < tokensetsize; i++)
|
for (i = 0; i < tokensetsize; i++)
|
||||||
shiftset[i] = 0;
|
shiftset[i] = 0;
|
||||||
|
|
||||||
if (shiftp)
|
for (i = 0; i < shiftp->nshifts && SHIFT_IS_SHIFT (shiftp, i); i++)
|
||||||
{
|
if (!SHIFT_IS_DISABLED (shiftp, i))
|
||||||
k = shiftp->nshifts;
|
SETBIT (shiftset, SHIFT_SYMBOL (shiftp, i));
|
||||||
for (i = 0; i < k; i++)
|
|
||||||
{
|
|
||||||
if (!shiftp->shifts[i])
|
|
||||||
continue;
|
|
||||||
symbol = accessing_symbol[shiftp->shifts[i]];
|
|
||||||
if (ISVAR (symbol))
|
|
||||||
break;
|
|
||||||
SETBIT (shiftset, symbol);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
mask = 1;
|
|
||||||
fp1 = LA + m * tokensetsize;
|
|
||||||
fp2 = shiftset;
|
|
||||||
for (i = 0; i < ntokens; i++)
|
for (i = 0; i < ntokens; i++)
|
||||||
{
|
{
|
||||||
int defaulted = 0;
|
int defaulted = 0;
|
||||||
|
int count = BITISSET (shiftset, i);
|
||||||
|
|
||||||
if (mask & *fp2)
|
|
||||||
count = 1;
|
|
||||||
else
|
|
||||||
count = 0;
|
|
||||||
|
|
||||||
fp3 = fp1;
|
|
||||||
for (j = m; j < n; j++)
|
for (j = m; j < n; j++)
|
||||||
{
|
{
|
||||||
if (mask & *fp3)
|
if (BITISSET (LA (m), j))
|
||||||
{
|
{
|
||||||
if (count == 0)
|
if (count == 0)
|
||||||
{
|
{
|
||||||
if (j != default_LA)
|
if (j != default_LA)
|
||||||
{
|
fprintf (out,
|
||||||
rule = LAruleno[j];
|
_(" %-4s\treduce using rule %d (%s)\n"),
|
||||||
obstack_fgrow3 (&output_obstack,
|
tags[i],
|
||||||
_(" %-4s\treduce using rule %d (%s)\n"),
|
LAruleno[j],
|
||||||
tags[i], rule, tags[rlhs[rule]]);
|
tags[rule_table[LAruleno[j]].lhs]);
|
||||||
}
|
|
||||||
else
|
else
|
||||||
defaulted = 1;
|
defaulted = 1;
|
||||||
|
|
||||||
@@ -697,40 +524,25 @@ print_reductions (int state)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (defaulted)
|
if (defaulted)
|
||||||
{
|
fprintf (out,
|
||||||
rule = LAruleno[default_LA];
|
_(" %-4s\treduce using rule %d (%s)\n"),
|
||||||
obstack_fgrow3 (&output_obstack,
|
tags[i],
|
||||||
_(" %-4s\treduce using rule %d (%s)\n"),
|
LAruleno[default_LA],
|
||||||
tags[i], rule, tags[rlhs[rule]]);
|
tags[rule_table[LAruleno[default_LA]].lhs]);
|
||||||
defaulted = 0;
|
defaulted = 0;
|
||||||
}
|
fprintf (out,
|
||||||
rule = LAruleno[j];
|
|
||||||
obstack_fgrow3 (&output_obstack,
|
|
||||||
_(" %-4s\t[reduce using rule %d (%s)]\n"),
|
_(" %-4s\t[reduce using rule %d (%s)]\n"),
|
||||||
tags[i], rule, tags[rlhs[rule]]);
|
tags[i],
|
||||||
|
LAruleno[j],
|
||||||
|
tags[rule_table[LAruleno[j]].lhs]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fp3 += tokensetsize;
|
|
||||||
}
|
|
||||||
|
|
||||||
mask <<= 1;
|
|
||||||
if (mask == 0)
|
|
||||||
{
|
|
||||||
mask = 1;
|
|
||||||
/* We tried incrementing just fp1, and just fp2; both seem wrong.
|
|
||||||
It seems necessary to increment both in sync. */
|
|
||||||
fp1++;
|
|
||||||
fp2++;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (default_LA >= 0)
|
if (default_LA >= 0)
|
||||||
obstack_fgrow2 (&output_obstack,
|
fprintf (out, _(" $default\treduce using rule %d (%s)\n"),
|
||||||
_(" $default\treduce using rule %d (%s)\n"),
|
default_rule, tags[rule_table[default_rule].lhs]);
|
||||||
default_rule, tags[rlhs[default_rule]]);
|
|
||||||
|
|
||||||
obstack_1grow (&output_obstack, '\n');
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+4
-5
@@ -1,5 +1,5 @@
|
|||||||
/* Find and resolve or report look-ahead conflicts for bison,
|
/* Find and resolve or report look-ahead conflicts for bison,
|
||||||
Copyright 2000 Free Software Foundation, Inc.
|
Copyright 2000, 2001 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of Bison, the GNU Compiler Compiler.
|
This file is part of Bison, the GNU Compiler Compiler.
|
||||||
|
|
||||||
@@ -23,12 +23,11 @@
|
|||||||
# include "state.h"
|
# include "state.h"
|
||||||
|
|
||||||
void solve_conflicts PARAMS ((void));
|
void solve_conflicts PARAMS ((void));
|
||||||
void print_conflicts PARAMS ((FILE *out));
|
void conflicts_print PARAMS ((void));
|
||||||
void print_reductions PARAMS ((int));
|
void conflicts_output PARAMS ((FILE *out));
|
||||||
|
void print_reductions PARAMS ((FILE*out, int state));
|
||||||
void free_conflicts PARAMS ((void));
|
void free_conflicts PARAMS ((void));
|
||||||
|
|
||||||
/* Were there conflicts? */
|
/* Were there conflicts? */
|
||||||
extern int any_conflicts;
|
|
||||||
extern errs **err_table;
|
|
||||||
extern int expected_conflicts;
|
extern int expected_conflicts;
|
||||||
#endif /* !CONFLICTS_H_ */
|
#endif /* !CONFLICTS_H_ */
|
||||||
|
|||||||
+23
-32
@@ -1,5 +1,5 @@
|
|||||||
/* Match rules with nonterminals for bison,
|
/* Match rules with nonterminals for bison,
|
||||||
Copyright 1984, 1989, 2000 Free Software Foundation, Inc.
|
Copyright 1984, 1989, 2000, 2001 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of Bison, the GNU Compiler Compiler.
|
This file is part of Bison, the GNU Compiler Compiler.
|
||||||
|
|
||||||
@@ -19,50 +19,44 @@
|
|||||||
Boston, MA 02111-1307, USA. */
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
|
||||||
/* set_derives finds, for each variable (nonterminal), which rules can
|
|
||||||
derive it. It sets up the value of derives so that derives[i -
|
|
||||||
ntokens] points to a vector of rule numbers, terminated with -1.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "system.h"
|
#include "system.h"
|
||||||
|
#include "getargs.h"
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
|
#include "reader.h"
|
||||||
#include "gram.h"
|
#include "gram.h"
|
||||||
#include "derives.h"
|
#include "derives.h"
|
||||||
|
|
||||||
short **derives;
|
short **derives = NULL;
|
||||||
|
|
||||||
#if DEBUG
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
print_derives (void)
|
print_derives (void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
short *sp;
|
|
||||||
|
|
||||||
fputs ("\n\n\n", stdout);
|
fputs ("DERIVES\n", stderr);
|
||||||
printf (_("DERIVES"));
|
|
||||||
fputs ("\n\n", stdout);
|
|
||||||
|
|
||||||
for (i = ntokens; i < nsyms; i++)
|
for (i = ntokens; i < nsyms; i++)
|
||||||
{
|
{
|
||||||
printf (_("%s derives"), tags[i]);
|
short *sp;
|
||||||
|
fprintf (stderr, "\t%s derives\n", tags[i]);
|
||||||
for (sp = derives[i]; *sp > 0; sp++)
|
for (sp = derives[i]; *sp > 0; sp++)
|
||||||
{
|
{
|
||||||
printf (" %d", *sp);
|
short *rhsp;
|
||||||
|
fprintf (stderr, "\t\t%d:", *sp);
|
||||||
|
for (rhsp = ritem + rule_table[*sp].rhs; *rhsp > 0; ++rhsp)
|
||||||
|
fprintf (stderr, " %s", tags[*rhsp]);
|
||||||
|
fprintf (stderr, " (rule %d)\n", -*rhsp);
|
||||||
}
|
}
|
||||||
putchar ('\n');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
putchar ('\n');
|
fputs ("\n\n", stderr);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void
|
void
|
||||||
set_derives (void)
|
set_derives (void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
int lhs;
|
|
||||||
shorts *p;
|
shorts *p;
|
||||||
short *q;
|
short *q;
|
||||||
shorts **dset;
|
shorts **dset;
|
||||||
@@ -73,16 +67,14 @@ set_derives (void)
|
|||||||
|
|
||||||
p = delts;
|
p = delts;
|
||||||
for (i = nrules; i > 0; i--)
|
for (i = nrules; i > 0; i--)
|
||||||
{
|
if (rule_table[i].useful)
|
||||||
lhs = rlhs[i];
|
{
|
||||||
if (lhs >= 0)
|
int lhs = rule_table[i].lhs;
|
||||||
{
|
p->next = dset[lhs];
|
||||||
p->next = dset[lhs];
|
p->value = i;
|
||||||
p->value = i;
|
dset[lhs] = p;
|
||||||
dset[lhs] = p;
|
p++;
|
||||||
p++;
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
derives = XCALLOC (short *, nvars) - ntokens;
|
derives = XCALLOC (short *, nvars) - ntokens;
|
||||||
q = XCALLOC (short, nvars + nrules);
|
q = XCALLOC (short, nvars + nrules);
|
||||||
@@ -99,9 +91,8 @@ set_derives (void)
|
|||||||
*q++ = -1;
|
*q++ = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if DEBUG
|
if (trace_flag)
|
||||||
print_derives ();
|
print_derives ();
|
||||||
#endif
|
|
||||||
|
|
||||||
XFREE (dset + ntokens);
|
XFREE (dset + ntokens);
|
||||||
XFREE (delts);
|
XFREE (delts);
|
||||||
|
|||||||
+4
-5
@@ -1,5 +1,5 @@
|
|||||||
/* Match rules with nonterminals for bison,
|
/* Match rules with nonterminals for bison,
|
||||||
Copyright 1984, 1989, 2000 Free Software Foundation, Inc.
|
Copyright 1984, 1989, 2000, 2001 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of Bison, the GNU Compiler Compiler.
|
This file is part of Bison, the GNU Compiler Compiler.
|
||||||
|
|
||||||
@@ -21,12 +21,11 @@
|
|||||||
#ifndef DERIVES_H_
|
#ifndef DERIVES_H_
|
||||||
# define DERIVES_H_
|
# define DERIVES_H_
|
||||||
|
|
||||||
|
/* DERIVES[SYMBOL - NTOKENS] points to a vector of the number of the
|
||||||
|
rules that SYMBOL derives, terminated with -1. */
|
||||||
extern short **derives;
|
extern short **derives;
|
||||||
|
|
||||||
/* set_derives finds, for each variable (nonterminal), which rules can
|
/* Compute DERIVES. */
|
||||||
derive it. It sets up the value of derives so that derives[i -
|
|
||||||
ntokens] points to a vector of rule numbers, terminated with -1.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void set_derives PARAMS((void));
|
void set_derives PARAMS((void));
|
||||||
void free_derives PARAMS((void));
|
void free_derives PARAMS((void));
|
||||||
|
|||||||
+21
-10
@@ -23,6 +23,7 @@
|
|||||||
#include "getargs.h"
|
#include "getargs.h"
|
||||||
#include "files.h"
|
#include "files.h"
|
||||||
#include "gram.h"
|
#include "gram.h"
|
||||||
|
#include "error.h"
|
||||||
#include "complain.h"
|
#include "complain.h"
|
||||||
|
|
||||||
FILE *finput = NULL;
|
FILE *finput = NULL;
|
||||||
@@ -86,26 +87,36 @@ stringappend (const char *string1, const char *string2)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------.
|
/*-----------------------------------------------------------------.
|
||||||
| Computes the macro name used to avoid double inclusion in the |
|
| Computes the macro name used to avoid double inclusion in the |
|
||||||
| header of the parser and store it in header_macro_name. |
|
| header of the parser and store it in header_macro_name. Be sure |
|
||||||
`---------------------------------------------------------------*/
|
| to produce valid CPP names (don't start with digit, remain |
|
||||||
|
| alphanumerical + underscore). |
|
||||||
|
`-----------------------------------------------------------------*/
|
||||||
|
|
||||||
static char *
|
static char *
|
||||||
compute_header_macro (void)
|
compute_header_macro (void)
|
||||||
{
|
{
|
||||||
|
const char *prefix = "BISON_";
|
||||||
char *macro_name, *cp;
|
char *macro_name, *cp;
|
||||||
|
|
||||||
if (spec_defines_file)
|
if (spec_defines_file)
|
||||||
macro_name = xstrdup (spec_defines_file);
|
{
|
||||||
|
macro_name = XMALLOC (char,
|
||||||
|
strlen (prefix) +
|
||||||
|
strlen (spec_defines_file) + 1);
|
||||||
|
cp = stpcpy (macro_name, prefix);
|
||||||
|
cp = stpcpy (cp, spec_defines_file);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
macro_name = XMALLOC (char,
|
macro_name = XMALLOC (char,
|
||||||
|
strlen (prefix) +
|
||||||
strlen (base_name) +
|
strlen (base_name) +
|
||||||
strlen (header_extension) + 1);
|
strlen (header_extension) + 1);
|
||||||
|
cp = stpcpy (macro_name, prefix);
|
||||||
stpcpy (macro_name, base_name);
|
cp = stpcpy (cp, base_name);
|
||||||
strcat (macro_name, header_extension);
|
cp = stpcpy (cp, header_extension);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (cp = macro_name; *cp; ++cp)
|
for (cp = macro_name; *cp; ++cp)
|
||||||
@@ -201,9 +212,9 @@ skeleton_find (const char *envvar, const char *skeleton_name)
|
|||||||
if (!res)
|
if (!res)
|
||||||
{
|
{
|
||||||
/* Skeleton file name without path */
|
/* Skeleton file name without path */
|
||||||
const char *skel_name = strrchr(skeleton_name, '/');
|
const char *skel_name = strrchr (skeleton_name, '/');
|
||||||
if (!skel_name)
|
if (!skel_name)
|
||||||
skel_name = strrchr(skeleton_name, '\\');
|
skel_name = strrchr (skeleton_name, '\\');
|
||||||
if (!skel_name)
|
if (!skel_name)
|
||||||
skel_name = skeleton_name;
|
skel_name = skeleton_name;
|
||||||
else
|
else
|
||||||
|
|||||||
+6
-5
@@ -32,9 +32,9 @@ int no_lines_flag = 0;
|
|||||||
int no_parser_flag = 0;
|
int no_parser_flag = 0;
|
||||||
int token_table_flag = 0;
|
int token_table_flag = 0;
|
||||||
int verbose_flag = 0;
|
int verbose_flag = 0;
|
||||||
int statistics_flag = 0;
|
|
||||||
int yacc_flag = 0; /* for -y */
|
int yacc_flag = 0; /* for -y */
|
||||||
int graph_flag = 0;
|
int graph_flag = 0;
|
||||||
|
int trace_flag = 0;
|
||||||
|
|
||||||
const char *skeleton = NULL;
|
const char *skeleton = NULL;
|
||||||
|
|
||||||
@@ -63,11 +63,12 @@ static struct option longopts[] =
|
|||||||
{"defines", optional_argument, 0, 'd'},
|
{"defines", optional_argument, 0, 'd'},
|
||||||
{"verbose", no_argument, 0, 'v'},
|
{"verbose", no_argument, 0, 'v'},
|
||||||
{"file-prefix", required_argument, 0, 'b'},
|
{"file-prefix", required_argument, 0, 'b'},
|
||||||
|
{"output", required_argument, 0, 'o'},
|
||||||
{"output-file", required_argument, 0, 'o'},
|
{"output-file", required_argument, 0, 'o'},
|
||||||
{"graph", optional_argument, 0, 'g'},
|
{"graph", optional_argument, 0, 'g'},
|
||||||
|
|
||||||
/* Hidden. */
|
/* Hidden. */
|
||||||
{"statistics", no_argument, &statistics_flag, 1},
|
{"trace", no_argument, &trace_flag, 1},
|
||||||
{0, 0, 0, 0}
|
{0, 0, 0, 0}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -118,9 +119,9 @@ Output:\n\
|
|||||||
-d, --defines also produce a header file\n\
|
-d, --defines also produce a header file\n\
|
||||||
-v, --verbose also produce an explanation of the automaton\n\
|
-v, --verbose also produce an explanation of the automaton\n\
|
||||||
-b, --file-prefix=PREFIX specify a PREFIX for output files\n\
|
-b, --file-prefix=PREFIX specify a PREFIX for output files\n\
|
||||||
-o, --output-file=FILE leave output to FILE\n\
|
-o, --output=FILE leave output to FILE\n\
|
||||||
-g, --graph also produce a VCG graph description of the \
|
-g, --graph also produce a VCG description of the automaton\n\
|
||||||
automaton\n"), stream);
|
"), stream);
|
||||||
putc ('\n', stream);
|
putc ('\n', stream);
|
||||||
|
|
||||||
fputs (_("\
|
fputs (_("\
|
||||||
|
|||||||
+1
-1
@@ -31,11 +31,11 @@ extern int defines_flag; /* for -d */
|
|||||||
extern int locations_flag;
|
extern int locations_flag;
|
||||||
extern int no_lines_flag; /* for -l */
|
extern int no_lines_flag; /* for -l */
|
||||||
extern int no_parser_flag; /* for -n */
|
extern int no_parser_flag; /* for -n */
|
||||||
extern int statistics_flag;
|
|
||||||
extern int token_table_flag; /* for -k */
|
extern int token_table_flag; /* for -k */
|
||||||
extern int verbose_flag; /* for -v */
|
extern int verbose_flag; /* for -v */
|
||||||
extern int graph_flag; /* for -g */
|
extern int graph_flag; /* for -g */
|
||||||
extern int yacc_flag; /* for -y */
|
extern int yacc_flag; /* for -y */
|
||||||
|
extern int trace_flag;
|
||||||
|
|
||||||
void getargs PARAMS ((int argc, char *argv[]));
|
void getargs PARAMS ((int argc, char *argv[]));
|
||||||
|
|
||||||
|
|||||||
+59
-22
@@ -1,27 +1,27 @@
|
|||||||
/* Allocate input grammar variables for bison,
|
/* Allocate input grammar variables for bison,
|
||||||
Copyright 1984, 1986, 1989 Free Software Foundation, Inc.
|
Copyright 1984, 1986, 1989, 2001 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of Bison, the GNU Compiler Compiler.
|
This file is part of Bison, the GNU Compiler Compiler.
|
||||||
|
|
||||||
Bison is free software; you can redistribute it and/or modify
|
Bison is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
the Free Software Foundation; either version 2, or (at your option)
|
the Free Software Foundation; either version 2, or (at your option)
|
||||||
any later version.
|
any later version.
|
||||||
|
|
||||||
Bison is distributed in the hope that it will be useful,
|
Bison is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
GNU General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with Bison; see the file COPYING. If not, write to
|
along with Bison; see the file COPYING. If not, write to
|
||||||
the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
Boston, MA 02111-1307, USA. */
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
|
||||||
#include "system.h"
|
#include "system.h"
|
||||||
|
#include "gram.h"
|
||||||
void dummy PARAMS((void));
|
#include "reader.h"
|
||||||
|
|
||||||
/* comments for these variables are in gram.h */
|
/* comments for these variables are in gram.h */
|
||||||
|
|
||||||
@@ -32,15 +32,13 @@ int ntokens;
|
|||||||
int nvars;
|
int nvars;
|
||||||
|
|
||||||
short *ritem = NULL;
|
short *ritem = NULL;
|
||||||
short *rlhs = NULL;
|
rule_t *rule_table = NULL;
|
||||||
short *rrhs = NULL;
|
|
||||||
short *rprec = NULL;
|
short *rprec = NULL;
|
||||||
short *rprecsym = NULL;
|
short *rprecsym = NULL;
|
||||||
short *sprec = NULL;
|
short *sprec = NULL;
|
||||||
short *rassoc = NULL;
|
short *rassoc = NULL;
|
||||||
short *sassoc = NULL;
|
short *sassoc = NULL;
|
||||||
short *token_translations = NULL;
|
short *token_translations = NULL;
|
||||||
short *rline = NULL;
|
|
||||||
|
|
||||||
int start_symbol;
|
int start_symbol;
|
||||||
|
|
||||||
@@ -52,10 +50,49 @@ int pure_parser;
|
|||||||
|
|
||||||
int error_token_number;
|
int error_token_number;
|
||||||
|
|
||||||
/* This is to avoid linker problems which occur on VMS when using GCC,
|
|
||||||
when the file in question contains data definitions only. */
|
/*------------------------.
|
||||||
|
| Dump RITEM for traces. |
|
||||||
|
`------------------------*/
|
||||||
|
|
||||||
void
|
void
|
||||||
dummy (void)
|
ritem_print (FILE *out)
|
||||||
{
|
{
|
||||||
|
int i;
|
||||||
|
fputs ("RITEM\n", out);
|
||||||
|
for (i = 0; ritem[i]; ++i)
|
||||||
|
if (ritem[i] > 0)
|
||||||
|
fprintf (out, " %s", tags[ritem[i]]);
|
||||||
|
else
|
||||||
|
fprintf (out, " (rule %d)\n", -ritem[i]);
|
||||||
|
fputs ("\n\n", out);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------.
|
||||||
|
| Return the size of the longest rule RHS. |
|
||||||
|
`------------------------------------------*/
|
||||||
|
|
||||||
|
size_t
|
||||||
|
ritem_longest_rhs (void)
|
||||||
|
{
|
||||||
|
short *itemp;
|
||||||
|
int length;
|
||||||
|
int max;
|
||||||
|
|
||||||
|
length = 0;
|
||||||
|
max = 0;
|
||||||
|
for (itemp = ritem; *itemp; itemp++)
|
||||||
|
if (*itemp > 0)
|
||||||
|
{
|
||||||
|
length++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (length > max)
|
||||||
|
max = length;
|
||||||
|
length = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return max;
|
||||||
}
|
}
|
||||||
|
|||||||
+48
-19
@@ -1,5 +1,5 @@
|
|||||||
/* Data definitions for internal representation of bison's input,
|
/* Data definitions for internal representation of bison's input,
|
||||||
Copyright 1984, 1986, 1989, 1992 Free Software Foundation, Inc.
|
Copyright 1984, 1986, 1989, 1992, 2001 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of Bison, the GNU Compiler Compiler.
|
This file is part of Bison, the GNU Compiler Compiler.
|
||||||
|
|
||||||
@@ -38,21 +38,38 @@
|
|||||||
The rules receive rule numbers 1 to nrules in the order they are
|
The rules receive rule numbers 1 to nrules in the order they are
|
||||||
written. Actions and guards are accessed via the rule number.
|
written. Actions and guards are accessed via the rule number.
|
||||||
|
|
||||||
The rules themselves are described by three arrays: rrhs, rlhs and
|
The rules themselves are described by several arrays: amongst which
|
||||||
ritem. rlhs[R] is the symbol number of the left hand side of rule
|
RITEM, and RULE_TABLE.
|
||||||
R. The right hand side is stored as symbol numbers in a portion of
|
|
||||||
ritem. rrhs[R] contains the index in ritem of the beginning of the
|
RULE_TABLE is an array of struct rule_s, which members are:
|
||||||
|
|
||||||
|
RULE_TABLE[R].lhs -- the symbol number of the left hand side of
|
||||||
|
rule R. If -1, the rule has been thrown out by reduce.c and should
|
||||||
|
be ignored.
|
||||||
|
|
||||||
|
RULE_TABLE[R].rhs -- the index in RITEM of the beginning of the
|
||||||
portion for rule R.
|
portion for rule R.
|
||||||
|
|
||||||
If rlhs[R] is -1, the rule has been thrown out by reduce.c and
|
RULE_TABLE[R].prec -- the precedence level of R.
|
||||||
should be ignored.
|
|
||||||
|
RULE_TABLE[R].precsym -- the symbol-number of the symbol in %prec
|
||||||
|
for R (if any).
|
||||||
|
|
||||||
|
RULE_TABLE[R].assoc -- the associativity of R.
|
||||||
|
|
||||||
|
RULE_TABLE[R].line -- the line where R was defined.
|
||||||
|
|
||||||
|
RULE_TABLE[R].useful -- TRUE iff the rule is used.
|
||||||
|
|
||||||
|
The right hand side is stored as symbol numbers in a portion of
|
||||||
|
RITEM.
|
||||||
|
|
||||||
The length of the portion is one greater than the number of symbols
|
The length of the portion is one greater than the number of symbols
|
||||||
in the rule's right hand side. The last element in the portion
|
in the rule's right hand side. The last element in the portion
|
||||||
contains minus R, which identifies it as the end of a portion and
|
contains minus R, which identifies it as the end of a portion and
|
||||||
says which rule it is for.
|
says which rule it is for.
|
||||||
|
|
||||||
The portions of ritem come in order of increasing rule number and
|
The portions of RITEM come in order of increasing rule number and
|
||||||
are followed by an element which is zero to mark the end. nitems
|
are followed by an element which is zero to mark the end. nitems
|
||||||
is the total length of ritem, not counting the final zero. Each
|
is the total length of ritem, not counting the final zero. Each
|
||||||
element of ritem is called an "item" and its index in ritem is an
|
element of ritem is called an "item" and its index in ritem is an
|
||||||
@@ -61,10 +78,7 @@
|
|||||||
Item numbers are used in the finite state machine to represent
|
Item numbers are used in the finite state machine to represent
|
||||||
places that parsing can get to.
|
places that parsing can get to.
|
||||||
|
|
||||||
Precedence levels are recorded in the vectors sprec and rprec.
|
SPREC records the precedence level of each symbol.
|
||||||
sprec records the precedence level of each symbol, rprec the
|
|
||||||
precedence level of each rule. rprecsym is the symbol-number of
|
|
||||||
the symbol in %prec for this rule (if any).
|
|
||||||
|
|
||||||
Precedence levels are assigned in increasing order starting with 1
|
Precedence levels are assigned in increasing order starting with 1
|
||||||
so that numerically higher precedence values mean tighter binding
|
so that numerically higher precedence values mean tighter binding
|
||||||
@@ -84,18 +98,12 @@ extern int ntokens;
|
|||||||
extern int nvars;
|
extern int nvars;
|
||||||
|
|
||||||
extern short *ritem;
|
extern short *ritem;
|
||||||
extern short *rlhs;
|
|
||||||
extern short *rrhs;
|
|
||||||
extern short *rprec;
|
|
||||||
extern short *rprecsym;
|
|
||||||
extern short *sprec;
|
extern short *sprec;
|
||||||
extern short *rassoc;
|
|
||||||
extern short *sassoc;
|
extern short *sassoc;
|
||||||
extern short *rline; /* Source line number of each rule */
|
|
||||||
|
|
||||||
extern int start_symbol;
|
extern int start_symbol;
|
||||||
|
|
||||||
|
|
||||||
/* associativity values in elements of rassoc, sassoc. */
|
/* associativity values in elements of rassoc, sassoc. */
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
@@ -105,6 +113,19 @@ typedef enum
|
|||||||
} associativity;
|
} associativity;
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct rule_s
|
||||||
|
{
|
||||||
|
short lhs;
|
||||||
|
short rhs;
|
||||||
|
short prec;
|
||||||
|
short precsym;
|
||||||
|
short assoc;
|
||||||
|
short line;
|
||||||
|
bool useful;
|
||||||
|
} rule_t;
|
||||||
|
|
||||||
|
extern struct rule_s *rule_table;
|
||||||
|
|
||||||
/* token translation table: indexed by a token number as returned by
|
/* token translation table: indexed by a token number as returned by
|
||||||
the user's yylex routine, it yields the internal token number used
|
the user's yylex routine, it yields the internal token number used
|
||||||
by the parser and throughout bison. */
|
by the parser and throughout bison. */
|
||||||
@@ -126,4 +147,12 @@ extern int pure_parser;
|
|||||||
/* ERROR_TOKEN_NUMBER is the token number of the error token. */
|
/* ERROR_TOKEN_NUMBER is the token number of the error token. */
|
||||||
|
|
||||||
extern int error_token_number;
|
extern int error_token_number;
|
||||||
|
|
||||||
|
|
||||||
|
/* Dump RITEM for traces. */
|
||||||
|
void ritem_print PARAMS ((FILE *out));
|
||||||
|
|
||||||
|
/* Return the size of the longest rule RHS. */
|
||||||
|
size_t ritem_longest_rhs PARAMS ((void));
|
||||||
|
|
||||||
#endif /* !GRAM_H_ */
|
#endif /* !GRAM_H_ */
|
||||||
|
|||||||
+260
-364
@@ -1,5 +1,5 @@
|
|||||||
/* Compute look-ahead criteria for bison,
|
/* Compute look-ahead criteria for bison,
|
||||||
Copyright 1984, 1986, 1989, 2000 Free Software Foundation, Inc.
|
Copyright 1984, 1986, 1989, 2000, 2001 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of Bison, the GNU Compiler Compiler.
|
This file is part of Bison, the GNU Compiler Compiler.
|
||||||
|
|
||||||
@@ -31,88 +31,80 @@
|
|||||||
#include "lalr.h"
|
#include "lalr.h"
|
||||||
#include "nullable.h"
|
#include "nullable.h"
|
||||||
#include "derives.h"
|
#include "derives.h"
|
||||||
|
#include "getargs.h"
|
||||||
|
|
||||||
|
/* All the decorated states, indexed by the state number. Warning:
|
||||||
|
there is a state_TABLE in LR0.c, but it is different and static.
|
||||||
|
*/
|
||||||
|
state_t *state_table = NULL;
|
||||||
|
|
||||||
int tokensetsize;
|
int tokensetsize;
|
||||||
short *lookaheads;
|
|
||||||
short *LAruleno;
|
short *LAruleno;
|
||||||
unsigned *LA;
|
unsigned *LA;
|
||||||
short *accessing_symbol;
|
|
||||||
char *consistent;
|
static int ngotos;
|
||||||
core **state_table;
|
|
||||||
shifts **shift_table;
|
|
||||||
reductions **reduction_table;
|
|
||||||
short *goto_map;
|
short *goto_map;
|
||||||
short *from_state;
|
short *from_state;
|
||||||
short *to_state;
|
short *to_state;
|
||||||
|
|
||||||
extern void berror PARAMS ((const char *));
|
/* And for the famous F variable, which name is so descriptive that a
|
||||||
|
comment is hardly needed. <grin>. */
|
||||||
|
static unsigned *F = NULL;
|
||||||
|
#define F(Rule) (F + (Rule) * tokensetsize)
|
||||||
|
|
||||||
static int infinity;
|
|
||||||
static int maxrhs;
|
|
||||||
static int ngotos;
|
|
||||||
static unsigned *F;
|
|
||||||
static short **includes;
|
static short **includes;
|
||||||
static shorts **lookback;
|
static shorts **lookback;
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------.
|
||||||
|
| digraph & traverse. |
|
||||||
|
| |
|
||||||
|
| The following variables are used as common storage between the |
|
||||||
|
| two. |
|
||||||
|
`---------------------------------------------------------------*/
|
||||||
|
|
||||||
static short **R;
|
static short **R;
|
||||||
static short *INDEX;
|
static short *INDEX;
|
||||||
static short *VERTICES;
|
static short *VERTICES;
|
||||||
static int top;
|
static int top;
|
||||||
|
static int infinity;
|
||||||
|
|
||||||
static void
|
static void
|
||||||
traverse (int i)
|
traverse (int i)
|
||||||
{
|
{
|
||||||
unsigned *fp1;
|
|
||||||
unsigned *fp2;
|
|
||||||
unsigned *fp3;
|
|
||||||
int j;
|
int j;
|
||||||
short *rp;
|
size_t k;
|
||||||
|
|
||||||
int height;
|
int height;
|
||||||
unsigned *base;
|
size_t size = F (i + 1) - F(i);
|
||||||
|
|
||||||
VERTICES[++top] = i;
|
VERTICES[++top] = i;
|
||||||
INDEX[i] = height = top;
|
INDEX[i] = height = top;
|
||||||
|
|
||||||
base = F + i * tokensetsize;
|
if (R[i])
|
||||||
fp3 = base + tokensetsize;
|
for (j = 0; R[i][j] >= 0; ++j)
|
||||||
|
{
|
||||||
|
if (INDEX[R[i][j]] == 0)
|
||||||
|
traverse (R[i][j]);
|
||||||
|
|
||||||
rp = R[i];
|
if (INDEX[i] > INDEX[R[i][j]])
|
||||||
if (rp)
|
INDEX[i] = INDEX[R[i][j]];
|
||||||
{
|
|
||||||
while ((j = *rp++) >= 0)
|
|
||||||
{
|
|
||||||
if (INDEX[j] == 0)
|
|
||||||
traverse (j);
|
|
||||||
|
|
||||||
if (INDEX[i] > INDEX[j])
|
for (k = 0; k < size; ++k)
|
||||||
INDEX[i] = INDEX[j];
|
F (i)[k] |= F (R[i][j])[k];
|
||||||
|
}
|
||||||
fp1 = base;
|
|
||||||
fp2 = F + j * tokensetsize;
|
|
||||||
|
|
||||||
while (fp1 < fp3)
|
|
||||||
*fp1++ |= *fp2++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (INDEX[i] == height)
|
if (INDEX[i] == height)
|
||||||
{
|
for (;;)
|
||||||
for (;;)
|
{
|
||||||
{
|
j = VERTICES[top--];
|
||||||
j = VERTICES[top--];
|
INDEX[j] = infinity;
|
||||||
INDEX[j] = infinity;
|
|
||||||
|
|
||||||
if (i == j)
|
if (i == j)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
fp1 = base;
|
for (k = 0; k < size; ++k)
|
||||||
fp2 = F + j * tokensetsize;
|
F (i)[k] = F (j)[k];
|
||||||
|
}
|
||||||
while (fp1 < fp3)
|
|
||||||
*fp2++ = *fp1++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -132,87 +124,85 @@ digraph (short **relation)
|
|||||||
INDEX[i] = 0;
|
INDEX[i] = 0;
|
||||||
|
|
||||||
for (i = 0; i < ngotos; i++)
|
for (i = 0; i < ngotos; i++)
|
||||||
{
|
if (INDEX[i] == 0 && R[i])
|
||||||
if (INDEX[i] == 0 && R[i])
|
traverse (i);
|
||||||
traverse (i);
|
|
||||||
}
|
|
||||||
|
|
||||||
XFREE (INDEX);
|
XFREE (INDEX);
|
||||||
XFREE (VERTICES);
|
XFREE (VERTICES);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*--------------------.
|
||||||
|
| Build STATE_TABLE. |
|
||||||
|
`--------------------*/
|
||||||
|
|
||||||
static void
|
static void
|
||||||
set_state_table (void)
|
set_state_table (void)
|
||||||
{
|
{
|
||||||
core *sp;
|
/* NSTATES + 1 because lookahead for the pseudo state number NSTATES
|
||||||
|
might be used (see conflicts.c). It is too opaque for me to
|
||||||
|
provide a probably less hacky implementation. --akim */
|
||||||
|
state_table = XCALLOC (state_t, nstates + 1);
|
||||||
|
|
||||||
state_table = XCALLOC (core *, nstates);
|
{
|
||||||
|
core *sp;
|
||||||
|
for (sp = first_state; sp; sp = sp->next)
|
||||||
|
{
|
||||||
|
state_table[sp->number].state = sp;
|
||||||
|
state_table[sp->number].accessing_symbol = sp->accessing_symbol;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for (sp = first_state; sp; sp = sp->next)
|
{
|
||||||
state_table[sp->number] = sp;
|
shifts *sp;
|
||||||
}
|
for (sp = first_shift; sp; sp = sp->next)
|
||||||
|
state_table[sp->number].shifts = sp;
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
reductions *rp;
|
||||||
|
for (rp = first_reduction; rp; rp = rp->next)
|
||||||
|
state_table[rp->number].reductions = rp;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
/* Pessimization, but simplification of the code: make sense all the
|
||||||
set_accessing_symbol (void)
|
states have a shifts, even if reduced to 0 shifts. */
|
||||||
{
|
{
|
||||||
core *sp;
|
int i;
|
||||||
|
for (i = 0; i < nstates; i++)
|
||||||
|
if (!state_table[i].shifts)
|
||||||
|
state_table[i].shifts = shifts_new (0);
|
||||||
|
}
|
||||||
|
|
||||||
accessing_symbol = XCALLOC (short, nstates);
|
/* Initializing the lookaheads members. Please note that it must be
|
||||||
|
performed after having set some of the other members which are
|
||||||
|
used below. Change with extreme caution. */
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
int count = 0;
|
||||||
|
for (i = 0; i < nstates; i++)
|
||||||
|
{
|
||||||
|
int k;
|
||||||
|
reductions *rp = state_table[i].reductions;
|
||||||
|
shifts *sp = state_table[i].shifts;
|
||||||
|
|
||||||
for (sp = first_state; sp; sp = sp->next)
|
state_table[i].lookaheads = count;
|
||||||
accessing_symbol[sp->number] = sp->accessing_symbol;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
if (rp
|
||||||
|
&& (rp->nreds > 1 || (sp->nshifts && SHIFT_IS_SHIFT (sp, 0))))
|
||||||
|
count += rp->nreds;
|
||||||
|
else
|
||||||
|
state_table[i].consistent = 1;
|
||||||
|
|
||||||
static void
|
for (k = 0; k < sp->nshifts; k++)
|
||||||
set_shift_table (void)
|
if (SHIFT_IS_ERROR (sp, k))
|
||||||
{
|
{
|
||||||
shifts *sp;
|
state_table[i].consistent = 0;
|
||||||
|
break;
|
||||||
shift_table = XCALLOC (shifts *, nstates);
|
}
|
||||||
|
}
|
||||||
for (sp = first_shift; sp; sp = sp->next)
|
state_table[nstates].lookaheads = count;
|
||||||
shift_table[sp->number] = sp;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
|
||||||
set_reduction_table (void)
|
|
||||||
{
|
|
||||||
reductions *rp;
|
|
||||||
|
|
||||||
reduction_table = XCALLOC (reductions *, nstates);
|
|
||||||
|
|
||||||
for (rp = first_reduction; rp; rp = rp->next)
|
|
||||||
reduction_table[rp->number] = rp;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
|
||||||
set_maxrhs (void)
|
|
||||||
{
|
|
||||||
short *itemp;
|
|
||||||
int length;
|
|
||||||
int max;
|
|
||||||
|
|
||||||
length = 0;
|
|
||||||
max = 0;
|
|
||||||
for (itemp = ritem; *itemp; itemp++)
|
|
||||||
{
|
|
||||||
if (*itemp > 0)
|
|
||||||
{
|
|
||||||
length++;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (length > max)
|
|
||||||
max = length;
|
|
||||||
length = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
maxrhs = max;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -221,65 +211,23 @@ initialize_LA (void)
|
|||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
int j;
|
int j;
|
||||||
int count;
|
|
||||||
reductions *rp;
|
|
||||||
shifts *sp;
|
|
||||||
short *np;
|
short *np;
|
||||||
|
reductions *rp;
|
||||||
|
|
||||||
consistent = XCALLOC (char, nstates);
|
size_t nLA = state_table[nstates].lookaheads;
|
||||||
lookaheads = XCALLOC (short, nstates + 1);
|
if (!nLA)
|
||||||
|
nLA = 1;
|
||||||
|
|
||||||
count = 0;
|
LA = XCALLOC (unsigned, nLA * tokensetsize);
|
||||||
for (i = 0; i < nstates; i++)
|
LAruleno = XCALLOC (short, nLA);
|
||||||
{
|
lookback = XCALLOC (shorts *, nLA);
|
||||||
int k;
|
|
||||||
|
|
||||||
lookaheads[i] = count;
|
|
||||||
|
|
||||||
rp = reduction_table[i];
|
|
||||||
sp = shift_table[i];
|
|
||||||
if (rp && (rp->nreds > 1
|
|
||||||
|| (sp && !ISVAR (accessing_symbol[sp->shifts[0]]))))
|
|
||||||
count += rp->nreds;
|
|
||||||
else
|
|
||||||
consistent[i] = 1;
|
|
||||||
|
|
||||||
if (sp)
|
|
||||||
for (k = 0; k < sp->nshifts; k++)
|
|
||||||
{
|
|
||||||
if (accessing_symbol[sp->shifts[k]] == error_token_number)
|
|
||||||
{
|
|
||||||
consistent[i] = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
lookaheads[nstates] = count;
|
|
||||||
|
|
||||||
if (count == 0)
|
|
||||||
{
|
|
||||||
LA = XCALLOC (unsigned, 1 * tokensetsize);
|
|
||||||
LAruleno = XCALLOC (short, 1);
|
|
||||||
lookback = XCALLOC (shorts *, 1);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
LA = XCALLOC (unsigned, count * tokensetsize);
|
|
||||||
LAruleno = XCALLOC (short, count);
|
|
||||||
lookback = XCALLOC (shorts *, count);
|
|
||||||
}
|
|
||||||
|
|
||||||
np = LAruleno;
|
np = LAruleno;
|
||||||
for (i = 0; i < nstates; i++)
|
for (i = 0; i < nstates; i++)
|
||||||
{
|
if (!state_table[i].consistent)
|
||||||
if (!consistent[i])
|
if ((rp = state_table[i].reductions))
|
||||||
{
|
for (j = 0; j < rp->nreds; j++)
|
||||||
if ((rp = reduction_table[i]))
|
*np++ = rp->rules[j];
|
||||||
for (j = 0; j < rp->nreds; j++)
|
|
||||||
*np++ = rp->rules[j];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -299,21 +247,16 @@ set_goto_map (void)
|
|||||||
|
|
||||||
ngotos = 0;
|
ngotos = 0;
|
||||||
for (sp = first_shift; sp; sp = sp->next)
|
for (sp = first_shift; sp; sp = sp->next)
|
||||||
{
|
for (i = sp->nshifts - 1; i >= 0 && SHIFT_IS_GOTO (sp, i); --i)
|
||||||
for (i = sp->nshifts - 1; i >= 0; i--)
|
{
|
||||||
{
|
symbol = state_table[sp->shifts[i]].accessing_symbol;
|
||||||
symbol = accessing_symbol[sp->shifts[i]];
|
|
||||||
|
|
||||||
if (ISTOKEN (symbol))
|
if (ngotos == MAXSHORT)
|
||||||
break;
|
fatal (_("too many gotos (max %d)"), MAXSHORT);
|
||||||
|
|
||||||
if (ngotos == MAXSHORT)
|
ngotos++;
|
||||||
fatal (_("too many gotos (max %d)"), MAXSHORT);
|
goto_map[symbol]++;
|
||||||
|
}
|
||||||
ngotos++;
|
|
||||||
goto_map[symbol]++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
k = 0;
|
k = 0;
|
||||||
for (i = ntokens; i < nsyms; i++)
|
for (i = ntokens; i < nsyms; i++)
|
||||||
@@ -334,13 +277,10 @@ set_goto_map (void)
|
|||||||
for (sp = first_shift; sp; sp = sp->next)
|
for (sp = first_shift; sp; sp = sp->next)
|
||||||
{
|
{
|
||||||
state1 = sp->number;
|
state1 = sp->number;
|
||||||
for (i = sp->nshifts - 1; i >= 0; i--)
|
for (i = sp->nshifts - 1; i >= 0 && SHIFT_IS_GOTO (sp, i); --i)
|
||||||
{
|
{
|
||||||
state2 = sp->shifts[i];
|
state2 = sp->shifts[i];
|
||||||
symbol = accessing_symbol[state2];
|
symbol = state_table[state2].accessing_symbol;
|
||||||
|
|
||||||
if (ISTOKEN (symbol))
|
|
||||||
break;
|
|
||||||
|
|
||||||
k = temp_map[symbol]++;
|
k = temp_map[symbol]++;
|
||||||
from_state[k] = state1;
|
from_state[k] = state1;
|
||||||
@@ -389,73 +329,46 @@ map_goto (int state, int symbol)
|
|||||||
static void
|
static void
|
||||||
initialize_F (void)
|
initialize_F (void)
|
||||||
{
|
{
|
||||||
|
short **reads = XCALLOC (short *, ngotos);
|
||||||
|
short *edge = XCALLOC (short, ngotos + 1);
|
||||||
|
int nedges = 0;
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
int j;
|
|
||||||
int k;
|
|
||||||
shifts *sp;
|
|
||||||
short *edge;
|
|
||||||
unsigned *rowp;
|
|
||||||
short *rp;
|
|
||||||
short **reads;
|
|
||||||
int nedges;
|
|
||||||
int stateno;
|
|
||||||
int symbol;
|
|
||||||
int nwords;
|
|
||||||
|
|
||||||
nwords = ngotos * tokensetsize;
|
F = XCALLOC (unsigned, ngotos * tokensetsize);
|
||||||
F = XCALLOC (unsigned, nwords);
|
|
||||||
|
|
||||||
reads = XCALLOC (short *, ngotos);
|
|
||||||
edge = XCALLOC (short, ngotos + 1);
|
|
||||||
nedges = 0;
|
|
||||||
|
|
||||||
rowp = F;
|
|
||||||
for (i = 0; i < ngotos; i++)
|
for (i = 0; i < ngotos; i++)
|
||||||
{
|
{
|
||||||
stateno = to_state[i];
|
int stateno = to_state[i];
|
||||||
sp = shift_table[stateno];
|
shifts *sp = state_table[stateno].shifts;
|
||||||
|
|
||||||
if (sp)
|
int j;
|
||||||
|
for (j = 0; j < sp->nshifts && SHIFT_IS_SHIFT (sp, j); j++)
|
||||||
{
|
{
|
||||||
k = sp->nshifts;
|
int symbol = state_table[sp->shifts[j]].accessing_symbol;
|
||||||
|
SETBIT (F (i), symbol);
|
||||||
for (j = 0; j < k; j++)
|
|
||||||
{
|
|
||||||
symbol = accessing_symbol[sp->shifts[j]];
|
|
||||||
if (ISVAR (symbol))
|
|
||||||
break;
|
|
||||||
SETBIT (rowp, symbol);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (; j < k; j++)
|
|
||||||
{
|
|
||||||
symbol = accessing_symbol[sp->shifts[j]];
|
|
||||||
if (nullable[symbol])
|
|
||||||
edge[nedges++] = map_goto (stateno, symbol);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (nedges)
|
|
||||||
{
|
|
||||||
reads[i] = rp = XCALLOC (short, nedges + 1);
|
|
||||||
|
|
||||||
for (j = 0; j < nedges; j++)
|
|
||||||
rp[j] = edge[j];
|
|
||||||
|
|
||||||
rp[nedges] = -1;
|
|
||||||
nedges = 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
rowp += tokensetsize;
|
for (; j < sp->nshifts; j++)
|
||||||
|
{
|
||||||
|
int symbol = state_table[sp->shifts[j]].accessing_symbol;
|
||||||
|
if (nullable[symbol])
|
||||||
|
edge[nedges++] = map_goto (stateno, symbol);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nedges)
|
||||||
|
{
|
||||||
|
reads[i] = XCALLOC (short, nedges + 1);
|
||||||
|
shortcpy (reads[i], edge, nedges);
|
||||||
|
reads[i][nedges] = -1;
|
||||||
|
nedges = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
digraph (reads);
|
digraph (reads);
|
||||||
|
|
||||||
for (i = 0; i < ngotos; i++)
|
for (i = 0; i < ngotos; i++)
|
||||||
{
|
XFREE (reads[i]);
|
||||||
if (reads[i])
|
|
||||||
XFREE (reads[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
XFREE (reads);
|
XFREE (reads);
|
||||||
XFREE (edge);
|
XFREE (edge);
|
||||||
@@ -470,8 +383,8 @@ add_lookback_edge (int stateno, int ruleno, int gotono)
|
|||||||
int found;
|
int found;
|
||||||
shorts *sp;
|
shorts *sp;
|
||||||
|
|
||||||
i = lookaheads[stateno];
|
i = state_table[stateno].lookaheads;
|
||||||
k = lookaheads[stateno + 1];
|
k = state_table[stateno + 1].lookaheads;
|
||||||
found = 0;
|
found = 0;
|
||||||
while (!found && i < k)
|
while (!found && i < k)
|
||||||
{
|
{
|
||||||
@@ -490,56 +403,87 @@ add_lookback_edge (int stateno, int ruleno, int gotono)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
matrix_print (FILE *out, short **matrix, int n)
|
||||||
|
{
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
for (i = 0; i < n; ++i)
|
||||||
|
{
|
||||||
|
fprintf (out, "%3d: ", i);
|
||||||
|
if (matrix[i])
|
||||||
|
for (j = 0; matrix[i][j] != -1; ++j)
|
||||||
|
fprintf (out, "%3d ", matrix[i][j]);
|
||||||
|
fputc ('\n', out);
|
||||||
|
}
|
||||||
|
fputc ('\n', out);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-------------------------------------------------------------------.
|
||||||
|
| Return the transpose of R_ARG, of size N. Destroy R_ARG, as it is |
|
||||||
|
| replaced with the result. |
|
||||||
|
| |
|
||||||
|
| R_ARG[I] is NULL or a -1 terminated list of numbers. |
|
||||||
|
| |
|
||||||
|
| RESULT[NUM] is NULL or the -1 terminated list of the I such as NUM |
|
||||||
|
| is in R_ARG[I]. |
|
||||||
|
`-------------------------------------------------------------------*/
|
||||||
|
|
||||||
static short **
|
static short **
|
||||||
transpose (short **R_arg, int n)
|
transpose (short **R_arg, int n)
|
||||||
{
|
{
|
||||||
short **new_R;
|
/* The result. */
|
||||||
short **temp_R;
|
short **new_R = XCALLOC (short *, n);
|
||||||
short *nedges;
|
/* END_R[I] -- next entry of NEW_R[I]. */
|
||||||
short *sp;
|
short **end_R = XCALLOC (short *, n);
|
||||||
int i;
|
/* NEDGES[I] -- total size of NEW_R[I]. */
|
||||||
int k;
|
short *nedges = XCALLOC (short, n);
|
||||||
|
int i, j;
|
||||||
|
|
||||||
nedges = XCALLOC (short, n);
|
if (trace_flag)
|
||||||
|
|
||||||
for (i = 0; i < n; i++)
|
|
||||||
{
|
{
|
||||||
sp = R_arg[i];
|
fputs ("transpose: input\n", stderr);
|
||||||
if (sp)
|
matrix_print (stderr, R_arg, n);
|
||||||
{
|
|
||||||
while (*sp >= 0)
|
|
||||||
nedges[*sp++]++;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
new_R = XCALLOC (short *, n);
|
/* Count. */
|
||||||
temp_R = XCALLOC (short *, n);
|
|
||||||
|
|
||||||
for (i = 0; i < n; i++)
|
for (i = 0; i < n; i++)
|
||||||
{
|
if (R_arg[i])
|
||||||
k = nedges[i];
|
for (j = 0; R_arg[i][j] >= 0; ++j)
|
||||||
if (k > 0)
|
++nedges[R_arg[i][j]];
|
||||||
{
|
|
||||||
sp = XCALLOC (short, k + 1);
|
|
||||||
new_R[i] = sp;
|
|
||||||
temp_R[i] = sp;
|
|
||||||
sp[k] = -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
XFREE (nedges);
|
|
||||||
|
|
||||||
|
/* Allocate. */
|
||||||
for (i = 0; i < n; i++)
|
for (i = 0; i < n; i++)
|
||||||
{
|
if (nedges[i] > 0)
|
||||||
sp = R_arg[i];
|
{
|
||||||
if (sp)
|
short *sp = XCALLOC (short, nedges[i] + 1);
|
||||||
{
|
sp[nedges[i]] = -1;
|
||||||
while (*sp >= 0)
|
new_R[i] = sp;
|
||||||
*temp_R[*sp++]++ = i;
|
end_R[i] = sp;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
XFREE (temp_R);
|
/* Store. */
|
||||||
|
for (i = 0; i < n; i++)
|
||||||
|
if (R_arg[i])
|
||||||
|
for (j = 0; R_arg[i][j] >= 0; ++j)
|
||||||
|
{
|
||||||
|
*end_R[R_arg[i][j]] = i;
|
||||||
|
++end_R[R_arg[i][j]];
|
||||||
|
}
|
||||||
|
|
||||||
|
free (nedges);
|
||||||
|
free (end_R);
|
||||||
|
|
||||||
|
/* Free the input: it is replaced with the result. */
|
||||||
|
for (i = 0; i < n; i++)
|
||||||
|
XFREE (R_arg[i]);
|
||||||
|
free (R_arg);
|
||||||
|
|
||||||
|
if (trace_flag)
|
||||||
|
{
|
||||||
|
fputs ("transpose: output\n", stderr);
|
||||||
|
matrix_print (stderr, new_R, n);
|
||||||
|
}
|
||||||
|
|
||||||
return new_R;
|
return new_R;
|
||||||
}
|
}
|
||||||
@@ -548,57 +492,42 @@ transpose (short **R_arg, int n)
|
|||||||
static void
|
static void
|
||||||
build_relations (void)
|
build_relations (void)
|
||||||
{
|
{
|
||||||
|
short *edge = XCALLOC (short, ngotos + 1);
|
||||||
|
short *states = XCALLOC (short, ritem_longest_rhs () + 1);
|
||||||
int i;
|
int i;
|
||||||
int j;
|
|
||||||
int k;
|
|
||||||
short *rulep;
|
|
||||||
short *rp;
|
|
||||||
shifts *sp;
|
|
||||||
int length;
|
|
||||||
int nedges;
|
|
||||||
int done;
|
|
||||||
int state1;
|
|
||||||
int stateno;
|
|
||||||
int symbol1;
|
|
||||||
int symbol2;
|
|
||||||
short *shortp;
|
|
||||||
short *edge;
|
|
||||||
short *states;
|
|
||||||
short **new_includes;
|
|
||||||
|
|
||||||
includes = XCALLOC (short *, ngotos);
|
includes = XCALLOC (short *, ngotos);
|
||||||
edge = XCALLOC (short, ngotos + 1);
|
|
||||||
states = XCALLOC (short, maxrhs + 1);
|
|
||||||
|
|
||||||
for (i = 0; i < ngotos; i++)
|
for (i = 0; i < ngotos; i++)
|
||||||
{
|
{
|
||||||
nedges = 0;
|
int nedges = 0;
|
||||||
state1 = from_state[i];
|
int state1 = from_state[i];
|
||||||
symbol1 = accessing_symbol[to_state[i]];
|
int symbol1 = state_table[to_state[i]].accessing_symbol;
|
||||||
|
short *rulep;
|
||||||
|
|
||||||
for (rulep = derives[symbol1]; *rulep > 0; rulep++)
|
for (rulep = derives[symbol1]; *rulep > 0; rulep++)
|
||||||
{
|
{
|
||||||
length = 1;
|
int done;
|
||||||
|
int length = 1;
|
||||||
|
int stateno = state1;
|
||||||
|
short *rp;
|
||||||
states[0] = state1;
|
states[0] = state1;
|
||||||
stateno = state1;
|
|
||||||
|
|
||||||
for (rp = ritem + rrhs[*rulep]; *rp > 0; rp++)
|
for (rp = ritem + rule_table[*rulep].rhs; *rp > 0; rp++)
|
||||||
{
|
{
|
||||||
symbol2 = *rp;
|
shifts *sp = state_table[stateno].shifts;
|
||||||
sp = shift_table[stateno];
|
int j;
|
||||||
k = sp->nshifts;
|
for (j = 0; j < sp->nshifts; j++)
|
||||||
|
|
||||||
for (j = 0; j < k; j++)
|
|
||||||
{
|
{
|
||||||
stateno = sp->shifts[j];
|
stateno = sp->shifts[j];
|
||||||
if (accessing_symbol[stateno] == symbol2)
|
if (state_table[stateno].accessing_symbol == *rp)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
states[length++] = stateno;
|
states[length++] = stateno;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!consistent[stateno])
|
if (!state_table[stateno].consistent)
|
||||||
add_lookback_edge (stateno, *rulep, i);
|
add_lookback_edge (stateno, *rulep, i);
|
||||||
|
|
||||||
length--;
|
length--;
|
||||||
@@ -620,25 +549,18 @@ build_relations (void)
|
|||||||
|
|
||||||
if (nedges)
|
if (nedges)
|
||||||
{
|
{
|
||||||
includes[i] = shortp = XCALLOC (short, nedges + 1);
|
int j;
|
||||||
|
includes[i] = XCALLOC (short, nedges + 1);
|
||||||
for (j = 0; j < nedges; j++)
|
for (j = 0; j < nedges; j++)
|
||||||
shortp[j] = edge[j];
|
includes[i][j] = edge[j];
|
||||||
shortp[nedges] = -1;
|
includes[i][nedges] = -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
new_includes = transpose (includes, ngotos);
|
|
||||||
|
|
||||||
for (i = 0; i < ngotos; i++)
|
|
||||||
if (includes[i])
|
|
||||||
XFREE (includes[i]);
|
|
||||||
|
|
||||||
XFREE (includes);
|
|
||||||
|
|
||||||
includes = new_includes;
|
|
||||||
|
|
||||||
XFREE (edge);
|
XFREE (edge);
|
||||||
XFREE (states);
|
XFREE (states);
|
||||||
|
|
||||||
|
includes = transpose (includes, ngotos);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -651,10 +573,7 @@ compute_FOLLOWS (void)
|
|||||||
digraph (includes);
|
digraph (includes);
|
||||||
|
|
||||||
for (i = 0; i < ngotos; i++)
|
for (i = 0; i < ngotos; i++)
|
||||||
{
|
XFREE (includes[i]);
|
||||||
if (includes[i])
|
|
||||||
XFREE (includes[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
XFREE (includes);
|
XFREE (includes);
|
||||||
}
|
}
|
||||||
@@ -664,39 +583,20 @@ static void
|
|||||||
compute_lookaheads (void)
|
compute_lookaheads (void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
int n;
|
|
||||||
unsigned *fp1;
|
|
||||||
unsigned *fp2;
|
|
||||||
unsigned *fp3;
|
|
||||||
shorts *sp;
|
shorts *sp;
|
||||||
unsigned *rowp;
|
|
||||||
shorts *sptmp; /* JF */
|
|
||||||
|
|
||||||
rowp = LA;
|
for (i = 0; i < state_table[nstates].lookaheads; i++)
|
||||||
n = lookaheads[nstates];
|
for (sp = lookback[i]; sp; sp = sp->next)
|
||||||
for (i = 0; i < n; i++)
|
{
|
||||||
{
|
int size = LA (i + 1) - LA (i);
|
||||||
fp3 = rowp + tokensetsize;
|
int j;
|
||||||
for (sp = lookback[i]; sp; sp = sp->next)
|
for (j = 0; j < size; ++j)
|
||||||
{
|
LA (i)[j] |= F (sp->value)[j];
|
||||||
fp1 = rowp;
|
}
|
||||||
fp2 = F + tokensetsize * sp->value;
|
|
||||||
while (fp1 < fp3)
|
|
||||||
*fp1++ |= *fp2++;
|
|
||||||
}
|
|
||||||
|
|
||||||
rowp = fp3;
|
/* Free LOOKBACK. */
|
||||||
}
|
for (i = 0; i < state_table[nstates].lookaheads; i++)
|
||||||
|
LIST_FREE (shorts, lookback[i]);
|
||||||
for (i = 0; i < n; i++)
|
|
||||||
{
|
|
||||||
/* JF removed ref to freed storage */
|
|
||||||
for (sp = lookback[i]; sp; sp = sptmp)
|
|
||||||
{
|
|
||||||
sptmp = sp->next;
|
|
||||||
XFREE (sp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
XFREE (lookback);
|
XFREE (lookback);
|
||||||
XFREE (F);
|
XFREE (F);
|
||||||
@@ -709,10 +609,6 @@ lalr (void)
|
|||||||
tokensetsize = WORDSIZE (ntokens);
|
tokensetsize = WORDSIZE (ntokens);
|
||||||
|
|
||||||
set_state_table ();
|
set_state_table ();
|
||||||
set_accessing_symbol ();
|
|
||||||
set_shift_table ();
|
|
||||||
set_reduction_table ();
|
|
||||||
set_maxrhs ();
|
|
||||||
initialize_LA ();
|
initialize_LA ();
|
||||||
set_goto_map ();
|
set_goto_map ();
|
||||||
initialize_F ();
|
initialize_F ();
|
||||||
|
|||||||
+28
-13
@@ -49,12 +49,6 @@ extern short *goto_map;
|
|||||||
extern short *from_state;
|
extern short *from_state;
|
||||||
extern short *to_state;
|
extern short *to_state;
|
||||||
|
|
||||||
/* CONSISTENT[S] is nonzero if no lookahead is needed to decide what
|
|
||||||
to do in state S. */
|
|
||||||
|
|
||||||
extern char *consistent;
|
|
||||||
|
|
||||||
|
|
||||||
/* LARULENO is a vector which records the rules that need lookahead in
|
/* LARULENO is a vector which records the rules that need lookahead in
|
||||||
various states. The elements of LARULENO that apply to state S are
|
various states. The elements of LARULENO that apply to state S are
|
||||||
those from LOOKAHEADS[S] through LOOKAHEADS[S+1]-1. Each element
|
those from LOOKAHEADS[S] through LOOKAHEADS[S+1]-1. Each element
|
||||||
@@ -72,15 +66,36 @@ extern short *LAruleno;
|
|||||||
it is a conflict. */
|
it is a conflict. */
|
||||||
|
|
||||||
extern unsigned *LA;
|
extern unsigned *LA;
|
||||||
|
#define LA(Rule) (LA + (Rule) * tokensetsize)
|
||||||
|
|
||||||
|
|
||||||
|
/* A structure decorating a state, with additional information. */
|
||||||
|
typedef struct state_s
|
||||||
|
{
|
||||||
|
/* A state. */
|
||||||
|
core *state;
|
||||||
|
|
||||||
|
/* Its accessing symbol. */
|
||||||
|
short accessing_symbol;
|
||||||
|
|
||||||
|
shifts *shifts;
|
||||||
|
reductions *reductions;
|
||||||
|
errs *errs;
|
||||||
|
|
||||||
|
/* Nonzero if no lookahead is needed to decide what to do in state
|
||||||
|
S. */
|
||||||
|
char consistent;
|
||||||
|
|
||||||
|
short lookaheads;
|
||||||
|
} state_t;
|
||||||
|
|
||||||
|
/* All the decorated states, indexed by the state number. Warning:
|
||||||
|
there is a state_TABLE in LR0.c, but it is different and static.
|
||||||
|
*/
|
||||||
|
extern state_t *state_table;
|
||||||
|
|
||||||
extern int tokensetsize;
|
extern int tokensetsize;
|
||||||
extern short *lookaheads;
|
|
||||||
extern short *accessing_symbol;
|
|
||||||
extern core **state_table;
|
|
||||||
extern shifts **shift_table;
|
|
||||||
extern reductions **reduction_table;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* The number of lookaheads. */
|
||||||
|
extern size_t nlookaheads;
|
||||||
#endif /* !LALR_H_ */
|
#endif /* !LALR_H_ */
|
||||||
|
|||||||
@@ -21,7 +21,6 @@
|
|||||||
#include "system.h"
|
#include "system.h"
|
||||||
#include "getargs.h"
|
#include "getargs.h"
|
||||||
#include "files.h"
|
#include "files.h"
|
||||||
#include "getopt.h" /* for optarg */
|
|
||||||
#include "symtab.h"
|
#include "symtab.h"
|
||||||
#include "lex.h"
|
#include "lex.h"
|
||||||
#include "complain.h"
|
#include "complain.h"
|
||||||
@@ -32,14 +31,13 @@
|
|||||||
struct obstack token_obstack;
|
struct obstack token_obstack;
|
||||||
const char *token_buffer = NULL;
|
const char *token_buffer = NULL;
|
||||||
|
|
||||||
bucket *symval;
|
bucket *symval = NULL;
|
||||||
int numval;
|
int numval;
|
||||||
|
|
||||||
/* these two describe a token to be reread */
|
/* A token to be reread, see unlex and lex. */
|
||||||
static token_t unlexed = tok_undef;
|
static token_t unlexed = tok_undef;
|
||||||
/* by the next call to lex */
|
|
||||||
static bucket *unlexed_symval = NULL;
|
static bucket *unlexed_symval = NULL;
|
||||||
|
static const char *unlexed_token_buffer = NULL;
|
||||||
|
|
||||||
void
|
void
|
||||||
lex_init (void)
|
lex_init (void)
|
||||||
@@ -324,6 +322,7 @@ void
|
|||||||
unlex (token_t token)
|
unlex (token_t token)
|
||||||
{
|
{
|
||||||
unlexed = token;
|
unlexed = token;
|
||||||
|
unlexed_token_buffer = token_buffer;
|
||||||
unlexed_symval = symval;
|
unlexed_symval = symval;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -368,6 +367,7 @@ lex (void)
|
|||||||
{
|
{
|
||||||
token_t res = unlexed;
|
token_t res = unlexed;
|
||||||
symval = unlexed_symval;
|
symval = unlexed_symval;
|
||||||
|
token_buffer = unlexed_token_buffer;
|
||||||
unlexed = tok_undef;
|
unlexed = tok_undef;
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
@@ -426,7 +426,7 @@ lex (void)
|
|||||||
/* parse the literal token and compute character code in code */
|
/* parse the literal token and compute character code in code */
|
||||||
|
|
||||||
{
|
{
|
||||||
int code, discode;
|
int code;
|
||||||
|
|
||||||
obstack_1grow (&token_obstack, '\'');
|
obstack_1grow (&token_obstack, '\'');
|
||||||
literalchar (&token_obstack, &code, '\'');
|
literalchar (&token_obstack, &code, '\'');
|
||||||
@@ -434,6 +434,7 @@ lex (void)
|
|||||||
c = getc (finput);
|
c = getc (finput);
|
||||||
if (c != '\'')
|
if (c != '\'')
|
||||||
{
|
{
|
||||||
|
int discode;
|
||||||
complain (_("use \"...\" for multi-character literal tokens"));
|
complain (_("use \"...\" for multi-character literal tokens"));
|
||||||
while (1)
|
while (1)
|
||||||
if (!literalchar (0, &discode, '\''))
|
if (!literalchar (0, &discode, '\''))
|
||||||
@@ -444,7 +445,7 @@ lex (void)
|
|||||||
token_buffer = obstack_finish (&token_obstack);
|
token_buffer = obstack_finish (&token_obstack);
|
||||||
symval = getsym (token_buffer);
|
symval = getsym (token_buffer);
|
||||||
symval->class = token_sym;
|
symval->class = token_sym;
|
||||||
if (!symval->user_token_number)
|
if (symval->user_token_number == SUNDEF)
|
||||||
symval->user_token_number = code;
|
symval->user_token_number = code;
|
||||||
return tok_identifier;
|
return tok_identifier;
|
||||||
}
|
}
|
||||||
@@ -552,28 +553,27 @@ struct percent_table_struct percent_table[] =
|
|||||||
{ "nonassoc", NULL, tok_nonassoc },
|
{ "nonassoc", NULL, tok_nonassoc },
|
||||||
{ "binary", NULL, tok_nonassoc },
|
{ "binary", NULL, tok_nonassoc },
|
||||||
{ "prec", NULL, tok_prec },
|
{ "prec", NULL, tok_prec },
|
||||||
{ "locations", &locations_flag, tok_noop }, /* -l */
|
{ "locations", &locations_flag, tok_intopt }, /* -l */
|
||||||
{ "no_lines", &no_lines_flag, tok_noop }, /* -l */
|
{ "no-lines", &no_lines_flag, tok_intopt }, /* -l */
|
||||||
{ "raw", NULL, tok_obsolete }, /* -r */
|
{ "raw", NULL, tok_obsolete }, /* -r */
|
||||||
{ "token_table", &token_table_flag, tok_noop }, /* -k */
|
{ "token-table", &token_table_flag, tok_intopt }, /* -k */
|
||||||
{ "yacc", &yacc_flag, tok_noop }, /* -y */
|
{ "yacc", &yacc_flag, tok_intopt }, /* -y */
|
||||||
{ "fixed_output_files",&yacc_flag, tok_noop }, /* -y */
|
{ "fixed-output-files",&yacc_flag, tok_intopt }, /* -y */
|
||||||
{ "defines", &defines_flag, tok_noop }, /* -d */
|
{ "defines", &defines_flag, tok_intopt }, /* -d */
|
||||||
{ "no_parser", &no_parser_flag, tok_noop }, /* -n */
|
{ "no-parser", &no_parser_flag, tok_intopt }, /* -n */
|
||||||
{ "graph", &graph_flag, tok_noop }, /* -g */
|
{ "graph", &graph_flag, tok_intopt }, /* -g */
|
||||||
#if 0
|
|
||||||
/* For the time being, this is not enabled yet, while it's possible
|
/* FIXME: semantic parsers which will output an `include' of an
|
||||||
though, since we use obstacks. The only risk is with semantic
|
output file: be sure that the name included is indeed the name of
|
||||||
parsers which will output an `include' of an output file: be sure
|
the output file. */
|
||||||
that the name included is indeed the name of the output file. */
|
{ "output", &spec_outfile, tok_stropt }, /* -o */
|
||||||
{ "output_file", &spec_outfile, tok_setopt }, /* -o */
|
{ "file-prefix", &spec_file_prefix, tok_stropt }, /* -b */
|
||||||
{ "file_prefix", &spec_file_prefix, tok_setopt }, /* -b */
|
{ "name-prefix", &spec_name_prefix, tok_stropt }, /* -p */
|
||||||
{ "name_prefix", &spec_name_prefix, tok_setopt }, /* -p */
|
|
||||||
#endif
|
{ "verbose", &verbose_flag, tok_intopt }, /* -v */
|
||||||
{ "verbose", &verbose_flag, tok_noop }, /* -v */
|
{ "debug", &debug_flag, tok_intopt }, /* -t */
|
||||||
{ "debug", &debug_flag, tok_noop }, /* -t */
|
{ "semantic-parser", &semantic_parser, tok_intopt },
|
||||||
{ "semantic_parser", &semantic_parser, tok_noop },
|
{ "pure-parser", &pure_parser, tok_intopt },
|
||||||
{ "pure_parser", &pure_parser, tok_noop },
|
|
||||||
|
|
||||||
{ NULL, NULL, tok_illegal}
|
{ NULL, NULL, tok_illegal}
|
||||||
};
|
};
|
||||||
@@ -584,7 +584,10 @@ struct percent_table_struct percent_table[] =
|
|||||||
token_t
|
token_t
|
||||||
parse_percent_token (void)
|
parse_percent_token (void)
|
||||||
{
|
{
|
||||||
struct percent_table_struct *tx;
|
struct percent_table_struct *tx = NULL;
|
||||||
|
const char *arg = NULL;
|
||||||
|
/* Where the ARG was found in token_buffer. */
|
||||||
|
size_t arg_offset = 0;
|
||||||
|
|
||||||
int c = getc (finput);
|
int c = getc (finput);
|
||||||
|
|
||||||
@@ -596,6 +599,8 @@ parse_percent_token (void)
|
|||||||
case '{':
|
case '{':
|
||||||
return tok_percent_left_curly;
|
return tok_percent_left_curly;
|
||||||
|
|
||||||
|
/* FIXME: Who the heck are those 5 guys!?! `%<' = `%left'!!!
|
||||||
|
Let's ask for there removal. */
|
||||||
case '<':
|
case '<':
|
||||||
return tok_left;
|
return tok_left;
|
||||||
|
|
||||||
@@ -618,42 +623,81 @@ parse_percent_token (void)
|
|||||||
obstack_1grow (&token_obstack, '%');
|
obstack_1grow (&token_obstack, '%');
|
||||||
while (isalpha (c) || c == '_' || c == '-')
|
while (isalpha (c) || c == '_' || c == '-')
|
||||||
{
|
{
|
||||||
if (c == '-')
|
if (c == '_')
|
||||||
c = '_';
|
c = '-';
|
||||||
obstack_1grow (&token_obstack, c);
|
obstack_1grow (&token_obstack, c);
|
||||||
c = getc (finput);
|
c = getc (finput);
|
||||||
}
|
}
|
||||||
|
|
||||||
ungetc (c, finput);
|
/* %DIRECTIVE="ARG". Separate into
|
||||||
|
TOKEN_BUFFER = `%DIRECTIVE\0ARG\0'.
|
||||||
|
This is a bit hackish, but once we move to a Bison parser,
|
||||||
|
things will be cleaned up. */
|
||||||
|
if (c == '=')
|
||||||
|
{
|
||||||
|
/* End of the directive. We skip the `='. */
|
||||||
|
obstack_1grow (&token_obstack, '\0');
|
||||||
|
/* Fetch the ARG if present. */
|
||||||
|
c = getc (finput);
|
||||||
|
if (c == '"')
|
||||||
|
{
|
||||||
|
int code;
|
||||||
|
arg_offset = obstack_object_size (&token_obstack);
|
||||||
|
/* Read up to and including `"'. Do not append the closing
|
||||||
|
`"' in the output: it's not part of the ARG. */
|
||||||
|
while (literalchar (NULL, &code, '"'))
|
||||||
|
obstack_1grow (&token_obstack, code);
|
||||||
|
}
|
||||||
|
/* else: should be an error. */
|
||||||
|
}
|
||||||
|
else
|
||||||
|
ungetc (c, finput);
|
||||||
|
|
||||||
obstack_1grow (&token_obstack, '\0');
|
obstack_1grow (&token_obstack, '\0');
|
||||||
token_buffer = obstack_finish (&token_obstack);
|
token_buffer = obstack_finish (&token_obstack);
|
||||||
|
if (arg_offset)
|
||||||
|
arg = token_buffer + arg_offset;
|
||||||
|
|
||||||
/* table lookup % directive */
|
/* table lookup % directive */
|
||||||
for (tx = percent_table; tx->name; tx++)
|
for (tx = percent_table; tx->name; tx++)
|
||||||
if (strcmp (token_buffer + 1, tx->name) == 0)
|
if (strcmp (token_buffer + 1, tx->name) == 0)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (tx->set_flag)
|
if (arg && tx->retval != tok_stropt)
|
||||||
{
|
fatal (_("`%s' supports no argument: %s"), token_buffer, quote (arg));
|
||||||
*((int *) (tx->set_flag)) = 1;
|
|
||||||
return tok_noop;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (tx->retval)
|
switch (tx->retval)
|
||||||
{
|
{
|
||||||
case tok_setopt:
|
case tok_stropt:
|
||||||
*((char **) (tx->set_flag)) = optarg;
|
assert (tx->set_flag);
|
||||||
|
if (arg)
|
||||||
|
{
|
||||||
|
/* Keep only the first assignment: command line options have
|
||||||
|
already been processed, and we want them to have
|
||||||
|
precedence. Side effect: if this %-option is used
|
||||||
|
several times, only the first is honored. Bah. */
|
||||||
|
if (!*((char **) (tx->set_flag)))
|
||||||
|
*((char **) (tx->set_flag)) = xstrdup (arg);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
fatal (_("`%s' requires an argument"), token_buffer);
|
||||||
|
return tok_noop;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case tok_intopt:
|
||||||
|
assert (tx->set_flag);
|
||||||
|
*((int *) (tx->set_flag)) = 1;
|
||||||
return tok_noop;
|
return tok_noop;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case tok_obsolete:
|
case tok_obsolete:
|
||||||
fatal (_("`%s' is no longer supported"), token_buffer);
|
fatal (_("`%s' is no longer supported"), token_buffer);
|
||||||
|
return tok_noop;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
/* Other cases do not apply here. */
|
return tx->retval;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
abort ();
|
||||||
return tx->retval;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -49,7 +49,8 @@ typedef enum token_e
|
|||||||
tok_expect,
|
tok_expect,
|
||||||
tok_thong,
|
tok_thong,
|
||||||
tok_noop,
|
tok_noop,
|
||||||
tok_setopt,
|
tok_intopt,
|
||||||
|
tok_stropt,
|
||||||
tok_illegal,
|
tok_illegal,
|
||||||
tok_obsolete
|
tok_obsolete
|
||||||
} token_t;
|
} token_t;
|
||||||
|
|||||||
+17
-19
@@ -1,5 +1,5 @@
|
|||||||
/* Top level entry point of bison,
|
/* Top level entry point of bison,
|
||||||
Copyright 1984, 1986, 1989, 1992, 1995, 2000
|
Copyright 1984, 1986, 1989, 1992, 1995, 2000, 2001
|
||||||
Free Software Foundation, Inc.
|
Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of Bison, the GNU Compiler Compiler.
|
This file is part of Bison, the GNU Compiler Compiler.
|
||||||
@@ -40,7 +40,6 @@
|
|||||||
/* The name this program was run with, for messages. */
|
/* The name this program was run with, for messages. */
|
||||||
char *program_name;
|
char *program_name;
|
||||||
|
|
||||||
extern void berror PARAMS((const char *));
|
|
||||||
|
|
||||||
int
|
int
|
||||||
main (int argc, char *argv[])
|
main (int argc, char *argv[])
|
||||||
@@ -62,15 +61,15 @@ main (int argc, char *argv[])
|
|||||||
if (complain_message_count)
|
if (complain_message_count)
|
||||||
exit (1);
|
exit (1);
|
||||||
|
|
||||||
/* find useless nonterminals and productions and reduce the grammar. In
|
/* Find useless nonterminals and productions and reduce the grammar. */
|
||||||
file reduce.c */
|
|
||||||
reduce_grammar ();
|
reduce_grammar ();
|
||||||
|
|
||||||
/* record other info about the grammar. In files derives and nullable. */
|
/* Record other info about the grammar. In files derives and
|
||||||
|
nullable. */
|
||||||
set_derives ();
|
set_derives ();
|
||||||
set_nullable ();
|
set_nullable ();
|
||||||
|
|
||||||
/* convert to nondeterministic finite state machine. In file LR0.
|
/* Convert to nondeterministic finite state machine. In file LR0.
|
||||||
See state.h for more info. */
|
See state.h for more info. */
|
||||||
generate_states ();
|
generate_states ();
|
||||||
|
|
||||||
@@ -82,6 +81,7 @@ main (int argc, char *argv[])
|
|||||||
conflicts. Also resolve s/r conflicts based on precedence
|
conflicts. Also resolve s/r conflicts based on precedence
|
||||||
declarations. */
|
declarations. */
|
||||||
solve_conflicts ();
|
solve_conflicts ();
|
||||||
|
conflicts_print ();
|
||||||
|
|
||||||
/* Output file names. */
|
/* Output file names. */
|
||||||
compute_output_file_names ();
|
compute_output_file_names ();
|
||||||
@@ -91,7 +91,7 @@ main (int argc, char *argv[])
|
|||||||
if (complain_message_count)
|
if (complain_message_count)
|
||||||
exit (1);
|
exit (1);
|
||||||
|
|
||||||
/* Print information about results, if requested. */
|
/* Output the detailed report on the grammar. */
|
||||||
print_results ();
|
print_results ();
|
||||||
|
|
||||||
/* Output the VCG graph. */
|
/* Output the VCG graph. */
|
||||||
@@ -100,28 +100,26 @@ main (int argc, char *argv[])
|
|||||||
/* Output the tables and the parser to ftable. In file output. */
|
/* Output the tables and the parser to ftable. In file output. */
|
||||||
output ();
|
output ();
|
||||||
|
|
||||||
|
/* Close the input files. */
|
||||||
|
close_files ();
|
||||||
|
|
||||||
/* Free the symbol table data structure. */
|
/* Free the symbol table data structure. */
|
||||||
free_symtab ();
|
free_symtab ();
|
||||||
|
|
||||||
lex_free ();
|
lex_free ();
|
||||||
|
|
||||||
/* Close the input files. */
|
reduce_free ();
|
||||||
close_files ();
|
|
||||||
|
|
||||||
free_conflicts ();
|
free_conflicts ();
|
||||||
free_nullable ();
|
free_nullable ();
|
||||||
free_derives ();
|
free_derives ();
|
||||||
|
|
||||||
output_files ();
|
output_files ();
|
||||||
|
|
||||||
exit (complain_message_count ? 1 : 0);
|
/* If using alloca.c, flush the alloca'ed memory for the benefit of
|
||||||
}
|
people running Bison as a library in IDEs. */
|
||||||
|
#if C_ALLOCA
|
||||||
/* Abort for an internal error denoted by string S. */
|
alloca (0);
|
||||||
|
#endif
|
||||||
|
|
||||||
void
|
return complain_message_count ? EXIT_FAILURE : EXIT_SUCCESS;
|
||||||
berror (const char *s)
|
|
||||||
{
|
|
||||||
fprintf (stderr, _("%s: internal error: %s\n"), program_name, s);
|
|
||||||
abort ();
|
|
||||||
}
|
}
|
||||||
|
|||||||
+59
-59
@@ -1,5 +1,5 @@
|
|||||||
/* Part of the bison parser generator,
|
/* Part of the bison parser generator,
|
||||||
Copyright 1984, 1989, 2000 Free Software Foundation, Inc.
|
Copyright 1984, 1989, 2000, 2001 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of Bison, the GNU Compiler Compiler.
|
This file is part of Bison, the GNU Compiler Compiler.
|
||||||
|
|
||||||
@@ -24,32 +24,40 @@
|
|||||||
do so. */
|
do so. */
|
||||||
|
|
||||||
#include "system.h"
|
#include "system.h"
|
||||||
|
#include "getargs.h"
|
||||||
|
#include "reader.h"
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
#include "gram.h"
|
#include "gram.h"
|
||||||
|
#include "reduce.h"
|
||||||
#include "nullable.h"
|
#include "nullable.h"
|
||||||
|
|
||||||
char *nullable = NULL;
|
char *nullable = NULL;
|
||||||
|
|
||||||
|
static void
|
||||||
|
nullable_print (FILE *out)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
fputs ("NULLABLE\n", out);
|
||||||
|
for (i = ntokens; i < nsyms; i++)
|
||||||
|
fprintf (out, "\t%s: %s\n", tags[i], nullable[i] ? "yes" : "no");
|
||||||
|
fputs ("\n\n", out);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
set_nullable (void)
|
set_nullable (void)
|
||||||
{
|
{
|
||||||
short *r;
|
short *r;
|
||||||
short *s1;
|
short *s1;
|
||||||
short *s2;
|
short *s2;
|
||||||
int ruleno;
|
|
||||||
int symbol;
|
|
||||||
shorts *p;
|
shorts *p;
|
||||||
|
|
||||||
short *squeue;
|
short *squeue;
|
||||||
short *rcount;
|
short *rcount;
|
||||||
shorts **rsets;
|
shorts **rsets;
|
||||||
shorts *relts;
|
shorts *relts;
|
||||||
char any_tokens;
|
|
||||||
short *r1;
|
|
||||||
|
|
||||||
#ifdef TRACE
|
if (trace_flag)
|
||||||
fprintf (stderr, _("Entering set_nullable"));
|
fprintf (stderr, "Entering set_nullable\n");
|
||||||
#endif
|
|
||||||
|
|
||||||
nullable = XCALLOC (char, nvars) - ntokens;
|
nullable = XCALLOC (char, nvars) - ntokens;
|
||||||
|
|
||||||
@@ -57,74 +65,66 @@ set_nullable (void)
|
|||||||
s1 = s2 = squeue;
|
s1 = s2 = squeue;
|
||||||
|
|
||||||
rcount = XCALLOC (short, nrules + 1);
|
rcount = XCALLOC (short, nrules + 1);
|
||||||
rsets = XCALLOC (shorts *, nvars) - ntokens;
|
|
||||||
|
/* RITEM contains all the rules, including useless productions.
|
||||||
|
Hence we must allocate room for useless nonterminals too. */
|
||||||
|
rsets = XCALLOC (shorts *, nvars + nuseless_nonterminals) - ntokens;
|
||||||
/* This is said to be more elements than we actually use.
|
/* This is said to be more elements than we actually use.
|
||||||
Supposedly nitems - nrules is enough.
|
Supposedly nitems - nrules is enough.
|
||||||
But why take the risk? */
|
But why take the risk? */
|
||||||
relts = XCALLOC (shorts, nitems + nvars + 1);
|
relts = XCALLOC (shorts, nitems + nvars + nuseless_nonterminals + 1);
|
||||||
p = relts;
|
p = relts;
|
||||||
|
|
||||||
r = ritem;
|
for (r = ritem; *r; ++r)
|
||||||
while (*r)
|
|
||||||
{
|
{
|
||||||
if (*r < 0)
|
/* Walk RITEM to find (i), if there are any tokens in the
|
||||||
{
|
RHS, and (ii), to find RULENO. */
|
||||||
symbol = rlhs[-(*r++)];
|
int ruleno;
|
||||||
if (symbol >= 0 && !nullable[symbol])
|
int any_tokens = 0;
|
||||||
{
|
short *r1;
|
||||||
nullable[symbol] = 1;
|
for (r1 = r; *r1 > 0; ++r1)
|
||||||
*s2++ = symbol;
|
if (ISTOKEN (*r1))
|
||||||
}
|
any_tokens = 1;
|
||||||
}
|
ruleno = -*r1;
|
||||||
else
|
|
||||||
{
|
|
||||||
r1 = r;
|
|
||||||
any_tokens = 0;
|
|
||||||
for (symbol = *r++; symbol > 0; symbol = *r++)
|
|
||||||
{
|
|
||||||
if (ISTOKEN (symbol))
|
|
||||||
any_tokens = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!any_tokens)
|
/* Examine the RHS of the rule. */
|
||||||
{
|
if (!any_tokens)
|
||||||
ruleno = -symbol;
|
for (/* Nothing. */; *r > 0; ++r)
|
||||||
r = r1;
|
{
|
||||||
for (symbol = *r++; symbol > 0; symbol = *r++)
|
rcount[ruleno]++;
|
||||||
{
|
p->next = rsets[*r];
|
||||||
rcount[ruleno]++;
|
p->value = ruleno;
|
||||||
p->next = rsets[symbol];
|
rsets[*r] = p;
|
||||||
p->value = ruleno;
|
p++;
|
||||||
rsets[symbol] = p;
|
}
|
||||||
p++;
|
|
||||||
}
|
/* Examine its LHS. */
|
||||||
}
|
if (rule_table[ruleno].useful && !nullable[rule_table[ruleno].lhs])
|
||||||
}
|
{
|
||||||
|
nullable[rule_table[ruleno].lhs] = 1;
|
||||||
|
*s2++ = rule_table[ruleno].lhs;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
while (s1 < s2)
|
while (s1 < s2)
|
||||||
{
|
for (p = rsets[*s1++]; p; p = p->next)
|
||||||
p = rsets[*s1++];
|
{
|
||||||
while (p)
|
int ruleno = p->value;
|
||||||
{
|
if (--rcount[ruleno] == 0)
|
||||||
ruleno = p->value;
|
if (rule_table[ruleno].useful && !nullable[rule_table[ruleno].lhs])
|
||||||
p = p->next;
|
|
||||||
if (--rcount[ruleno] == 0)
|
|
||||||
{
|
{
|
||||||
symbol = rlhs[ruleno];
|
nullable[rule_table[ruleno].lhs] = 1;
|
||||||
if (symbol >= 0 && !nullable[symbol])
|
*s2++ = rule_table[ruleno].lhs;
|
||||||
{
|
|
||||||
nullable[symbol] = 1;
|
|
||||||
*s2++ = symbol;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
XFREE (squeue);
|
XFREE (squeue);
|
||||||
XFREE (rcount);
|
XFREE (rcount);
|
||||||
XFREE (rsets + ntokens);
|
XFREE (rsets + ntokens);
|
||||||
XFREE (relts);
|
XFREE (relts);
|
||||||
|
|
||||||
|
if (trace_flag)
|
||||||
|
nullable_print (stderr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+72
-124
@@ -103,9 +103,6 @@
|
|||||||
#include "reader.h"
|
#include "reader.h"
|
||||||
#include "conflicts.h"
|
#include "conflicts.h"
|
||||||
|
|
||||||
extern void berror PARAMS((const char *));
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static int nvectors;
|
static int nvectors;
|
||||||
static int nentries;
|
static int nentries;
|
||||||
@@ -319,8 +316,15 @@ output_gram (void)
|
|||||||
if (!semantic_parser && !no_parser_flag)
|
if (!semantic_parser && !no_parser_flag)
|
||||||
obstack_sgrow (&table_obstack, "\n#if YYDEBUG != 0\n");
|
obstack_sgrow (&table_obstack, "\n#if YYDEBUG != 0\n");
|
||||||
|
|
||||||
output_short_table (&table_obstack, NULL, "yyprhs", rrhs,
|
{
|
||||||
0, 1, nrules + 1);
|
int i;
|
||||||
|
short *values = XCALLOC (short, nrules + 1);
|
||||||
|
for (i = 0; i < nrules + 1; ++i)
|
||||||
|
values[i] = rule_table[i].rhs;
|
||||||
|
output_short_table (&table_obstack, NULL, "yyprhs", values,
|
||||||
|
0, 1, nrules + 1);
|
||||||
|
XFREE (values);
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
size_t yyrhs_size = 1;
|
size_t yyrhs_size = 1;
|
||||||
@@ -347,7 +351,13 @@ output_gram (void)
|
|||||||
static void
|
static void
|
||||||
output_stos (void)
|
output_stos (void)
|
||||||
{
|
{
|
||||||
output_short_table (&table_obstack, NULL, "yystos", accessing_symbol,
|
int i;
|
||||||
|
short *values = (short *) alloca (sizeof (short) * nstates);
|
||||||
|
for (i = 0; i < nstates; ++i)
|
||||||
|
values[i] = state_table[i].accessing_symbol;
|
||||||
|
output_short_table (&table_obstack,
|
||||||
|
"YYSTOS[STATE] -- Accessing symbol to the STATE",
|
||||||
|
"yystos", values,
|
||||||
0, 1, nstates);
|
0, 1, nstates);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -362,10 +372,16 @@ output_rule_data (void)
|
|||||||
obstack_sgrow (&table_obstack, "\n\
|
obstack_sgrow (&table_obstack, "\n\
|
||||||
#if YYDEBUG != 0\n");
|
#if YYDEBUG != 0\n");
|
||||||
|
|
||||||
output_short_table (&table_obstack,
|
{
|
||||||
"YYRLINE[YYN] -- source line where rule number YYN was defined",
|
short *values = XCALLOC (short, nrules + 1);
|
||||||
"yyrline", rline,
|
for (i = 0; i < nrules + 1; ++i)
|
||||||
0, 1, nrules + 1);
|
values[i] = rule_table[i].line;
|
||||||
|
output_short_table (&table_obstack,
|
||||||
|
"YYRLINE[YYN] -- source line where rule number YYN was defined",
|
||||||
|
"yyrline", values,
|
||||||
|
0, 1, nrules + 1);
|
||||||
|
XFREE (values);
|
||||||
|
}
|
||||||
|
|
||||||
obstack_sgrow (&table_obstack, "#endif\n\n");
|
obstack_sgrow (&table_obstack, "#endif\n\n");
|
||||||
|
|
||||||
@@ -449,19 +465,24 @@ output_rule_data (void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Output YYR1. */
|
/* Output YYR1. */
|
||||||
output_short_table (&table_obstack,
|
{
|
||||||
|
short *values = XCALLOC (short, nrules + 1);
|
||||||
|
for (i = 0; i < nrules + 1; ++i)
|
||||||
|
values[i] = rule_table[i].lhs;
|
||||||
|
output_short_table (&table_obstack,
|
||||||
"YYR1[YYN] -- Symbol number of symbol that rule YYN derives",
|
"YYR1[YYN] -- Symbol number of symbol that rule YYN derives",
|
||||||
"yyr1", rlhs,
|
"yyr1", values,
|
||||||
0, 1, nrules + 1);
|
0, 1, nrules + 1);
|
||||||
XFREE (rlhs + 1);
|
XFREE (values);
|
||||||
|
}
|
||||||
|
|
||||||
obstack_1grow (&table_obstack, '\n');
|
obstack_1grow (&table_obstack, '\n');
|
||||||
|
|
||||||
/* Output YYR2. */
|
/* Output YYR2. */
|
||||||
short_tab = XMALLOC (short, nrules + 1);
|
short_tab = XMALLOC (short, nrules + 1);
|
||||||
for (i = 1; i < nrules; i++)
|
for (i = 1; i < nrules; i++)
|
||||||
short_tab[i] = rrhs[i + 1] - rrhs[i] - 1;
|
short_tab[i] = rule_table[i + 1].rhs - rule_table[i].rhs - 1;
|
||||||
short_tab[nrules] = nitems - rrhs[nrules] - 1;
|
short_tab[nrules] = nitems - rule_table[nrules].rhs - 1;
|
||||||
output_short_table (&table_obstack,
|
output_short_table (&table_obstack,
|
||||||
"YYR2[YYN] -- Number of symbols composing right hand side of rule YYN",
|
"YYR2[YYN] -- Number of symbols composing right hand side of rule YYN",
|
||||||
"yyr2", short_tab,
|
"yyr2", short_tab,
|
||||||
@@ -470,7 +491,7 @@ output_rule_data (void)
|
|||||||
|
|
||||||
XFREE (short_tab);
|
XFREE (short_tab);
|
||||||
|
|
||||||
XFREE (rrhs + 1);
|
XFREE (rule_table + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -505,15 +526,11 @@ action_row (int state)
|
|||||||
int k;
|
int k;
|
||||||
int m = 0;
|
int m = 0;
|
||||||
int n = 0;
|
int n = 0;
|
||||||
int count;
|
|
||||||
int default_rule;
|
int default_rule;
|
||||||
int nreds;
|
int nreds;
|
||||||
int max;
|
|
||||||
int rule;
|
int rule;
|
||||||
int shift_state;
|
int shift_state;
|
||||||
int symbol;
|
int symbol;
|
||||||
unsigned mask;
|
|
||||||
unsigned *wordp;
|
|
||||||
reductions *redp;
|
reductions *redp;
|
||||||
shifts *shiftp;
|
shifts *shiftp;
|
||||||
errs *errp;
|
errs *errp;
|
||||||
@@ -524,7 +541,7 @@ action_row (int state)
|
|||||||
|
|
||||||
default_rule = 0;
|
default_rule = 0;
|
||||||
nreds = 0;
|
nreds = 0;
|
||||||
redp = reduction_table[state];
|
redp = state_table[state].reductions;
|
||||||
|
|
||||||
if (redp)
|
if (redp)
|
||||||
{
|
{
|
||||||
@@ -534,69 +551,46 @@ action_row (int state)
|
|||||||
{
|
{
|
||||||
/* loop over all the rules available here which require
|
/* loop over all the rules available here which require
|
||||||
lookahead */
|
lookahead */
|
||||||
m = lookaheads[state];
|
m = state_table[state].lookaheads;
|
||||||
n = lookaheads[state + 1];
|
n = state_table[state + 1].lookaheads;
|
||||||
|
|
||||||
for (i = n - 1; i >= m; i--)
|
for (i = n - 1; i >= m; i--)
|
||||||
{
|
/* and find each token which the rule finds acceptable
|
||||||
rule = -LAruleno[i];
|
to come next */
|
||||||
wordp = LA + i * tokensetsize;
|
for (j = 0; j < ntokens; j++)
|
||||||
mask = 1;
|
/* and record this rule as the rule to use if that
|
||||||
|
token follows. */
|
||||||
/* and find each token which the rule finds acceptable
|
if (BITISSET (LA (i), j))
|
||||||
to come next */
|
actrow[j] = -LAruleno[i];
|
||||||
for (j = 0; j < ntokens; j++)
|
|
||||||
{
|
|
||||||
/* and record this rule as the rule to use if that
|
|
||||||
token follows. */
|
|
||||||
if (mask & *wordp)
|
|
||||||
actrow[j] = rule;
|
|
||||||
|
|
||||||
mask <<= 1;
|
|
||||||
if (mask == 0)
|
|
||||||
{
|
|
||||||
mask = 1;
|
|
||||||
wordp++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
shiftp = shift_table[state];
|
|
||||||
|
|
||||||
/* Now see which tokens are allowed for shifts in this state. For
|
/* Now see which tokens are allowed for shifts in this state. For
|
||||||
them, record the shift as the thing to do. So shift is preferred
|
them, record the shift as the thing to do. So shift is preferred
|
||||||
to reduce. */
|
to reduce. */
|
||||||
|
shiftp = state_table[state].shifts;
|
||||||
if (shiftp)
|
for (i = 0; i < shiftp->nshifts; i++)
|
||||||
{
|
{
|
||||||
k = shiftp->nshifts;
|
shift_state = shiftp->shifts[i];
|
||||||
|
if (!shift_state)
|
||||||
|
continue;
|
||||||
|
|
||||||
for (i = 0; i < k; i++)
|
symbol = state_table[shift_state].accessing_symbol;
|
||||||
{
|
|
||||||
shift_state = shiftp->shifts[i];
|
|
||||||
if (!shift_state)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
symbol = accessing_symbol[shift_state];
|
if (ISVAR (symbol))
|
||||||
|
break;
|
||||||
|
|
||||||
if (ISVAR (symbol))
|
actrow[symbol] = shift_state;
|
||||||
break;
|
|
||||||
|
|
||||||
actrow[symbol] = shift_state;
|
/* Do not use any default reduction if there is a shift for
|
||||||
|
error */
|
||||||
/* Do not use any default reduction if there is a shift for
|
if (symbol == error_token_number)
|
||||||
error */
|
nodefault = 1;
|
||||||
if (symbol == error_token_number)
|
|
||||||
nodefault = 1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
errp = err_table[state];
|
|
||||||
|
|
||||||
/* See which tokens are an explicit error in this state (due to
|
/* See which tokens are an explicit error in this state (due to
|
||||||
%nonassoc). For them, record MINSHORT as the action. */
|
%nonassoc). For them, record MINSHORT as the action. */
|
||||||
|
errp = state_table[state].errs;
|
||||||
|
|
||||||
if (errp)
|
if (errp)
|
||||||
{
|
{
|
||||||
@@ -614,14 +608,14 @@ action_row (int state)
|
|||||||
|
|
||||||
if (nreds >= 1 && !nodefault)
|
if (nreds >= 1 && !nodefault)
|
||||||
{
|
{
|
||||||
if (consistent[state])
|
if (state_table[state].consistent)
|
||||||
default_rule = redp->rules[0];
|
default_rule = redp->rules[0];
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
max = 0;
|
int max = 0;
|
||||||
for (i = m; i < n; i++)
|
for (i = m; i < n; i++)
|
||||||
{
|
{
|
||||||
count = 0;
|
int count = 0;
|
||||||
rule = -LAruleno[i];
|
rule = -LAruleno[i];
|
||||||
|
|
||||||
for (j = 0; j < ntokens; j++)
|
for (j = 0; j < ntokens; j++)
|
||||||
@@ -736,37 +730,6 @@ token_actions (void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
|
||||||
free_shifts (void)
|
|
||||||
{
|
|
||||||
shifts *sp, *sptmp; /* JF derefrenced freed ptr */
|
|
||||||
|
|
||||||
XFREE (shift_table);
|
|
||||||
|
|
||||||
for (sp = first_shift; sp; sp = sptmp)
|
|
||||||
{
|
|
||||||
sptmp = sp->next;
|
|
||||||
XFREE (sp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
|
||||||
free_reductions (void)
|
|
||||||
{
|
|
||||||
reductions *rp, *rptmp; /* JF fixed freed ptr */
|
|
||||||
|
|
||||||
XFREE (reduction_table);
|
|
||||||
|
|
||||||
for (rp = first_reduction; rp; rp = rptmp)
|
|
||||||
{
|
|
||||||
rptmp = rp->next;
|
|
||||||
XFREE (rp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
save_column (int symbol, int default_state)
|
save_column (int symbol, int default_state)
|
||||||
{
|
{
|
||||||
@@ -1014,8 +977,8 @@ pack_vector (int vector)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
berror ("pack_vector");
|
assert (!"pack_vector");
|
||||||
return 0; /* JF keep lint happy */
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1116,12 +1079,10 @@ output_actions (void)
|
|||||||
width = XCALLOC (short, nvectors);
|
width = XCALLOC (short, nvectors);
|
||||||
|
|
||||||
token_actions ();
|
token_actions ();
|
||||||
free_shifts ();
|
LIST_FREE (shifts, first_shift);
|
||||||
free_reductions ();
|
LIST_FREE (reductions, first_reduction);
|
||||||
XFREE (lookaheads);
|
|
||||||
XFREE (LA);
|
XFREE (LA);
|
||||||
XFREE (LAruleno);
|
XFREE (LAruleno);
|
||||||
XFREE (accessing_symbol);
|
|
||||||
|
|
||||||
goto_actions ();
|
goto_actions ();
|
||||||
XFREE (goto_map + ntokens);
|
XFREE (goto_map + ntokens);
|
||||||
@@ -1288,21 +1249,6 @@ output_program (void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
|
||||||
free_itemsets (void)
|
|
||||||
{
|
|
||||||
core *cp, *cptmp;
|
|
||||||
|
|
||||||
XFREE (state_table);
|
|
||||||
|
|
||||||
for (cp = first_state; cp; cp = cptmp)
|
|
||||||
{
|
|
||||||
cptmp = cp->next;
|
|
||||||
XFREE (cp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*----------------------------------------------------------.
|
/*----------------------------------------------------------.
|
||||||
| Output the parsing tables and the parser code to ftable. |
|
| Output the parsing tables and the parser code to ftable. |
|
||||||
`----------------------------------------------------------*/
|
`----------------------------------------------------------*/
|
||||||
@@ -1334,7 +1280,7 @@ output (void)
|
|||||||
if (!no_parser_flag)
|
if (!no_parser_flag)
|
||||||
obstack_sgrow (&table_obstack, "#include <stdio.h>\n\n");
|
obstack_sgrow (&table_obstack, "#include <stdio.h>\n\n");
|
||||||
|
|
||||||
free_itemsets ();
|
LIST_FREE (core, first_state);
|
||||||
output_defines ();
|
output_defines ();
|
||||||
output_token_translations ();
|
output_token_translations ();
|
||||||
/* if (semantic_parser) */
|
/* if (semantic_parser) */
|
||||||
@@ -1345,6 +1291,8 @@ output (void)
|
|||||||
output_stos ();
|
output_stos ();
|
||||||
output_rule_data ();
|
output_rule_data ();
|
||||||
output_actions ();
|
output_actions ();
|
||||||
|
XFREE (state_table);
|
||||||
|
|
||||||
if (!no_parser_flag)
|
if (!no_parser_flag)
|
||||||
output_parser ();
|
output_parser ();
|
||||||
output_program ();
|
output_program ();
|
||||||
|
|||||||
+112
-114
@@ -1,5 +1,5 @@
|
|||||||
/* Print information on generated parser, for bison,
|
/* Print information on generated parser, for bison,
|
||||||
Copyright 1984, 1986, 1989, 2000 Free Software Foundation, Inc.
|
Copyright 1984, 1986, 1989, 2000, 2001 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of Bison, the GNU Compiler Compiler.
|
This file is part of Bison, the GNU Compiler Compiler.
|
||||||
|
|
||||||
@@ -29,6 +29,8 @@
|
|||||||
#include "state.h"
|
#include "state.h"
|
||||||
#include "reader.h"
|
#include "reader.h"
|
||||||
#include "print.h"
|
#include "print.h"
|
||||||
|
#include "reduce.h"
|
||||||
|
#include "closure.h"
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
static void
|
static void
|
||||||
@@ -47,65 +49,60 @@ static void
|
|||||||
print_core (FILE *out, int state)
|
print_core (FILE *out, int state)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
int k;
|
short *sitems = state_table[state].state->items;
|
||||||
int rule;
|
int snitems = state_table[state].state->nitems;
|
||||||
core *statep;
|
|
||||||
short *sp;
|
|
||||||
short *sp1;
|
|
||||||
|
|
||||||
statep = state_table[state];
|
/* New experimental feature: if TRACE_FLAGS output all the items of
|
||||||
k = statep->nitems;
|
a state, not only its kernel. */
|
||||||
|
if (trace_flag)
|
||||||
if (k == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
for (i = 0; i < k; i++)
|
|
||||||
{
|
{
|
||||||
sp1 = sp = ritem + statep->items[i];
|
closure (sitems, snitems);
|
||||||
|
sitems = itemset;
|
||||||
while (*sp > 0)
|
snitems = nitemset;
|
||||||
sp++;
|
|
||||||
|
|
||||||
rule = -(*sp);
|
|
||||||
fprintf (out, " %s -> ", tags[rlhs[rule]]);
|
|
||||||
|
|
||||||
for (sp = ritem + rrhs[rule]; sp < sp1; sp++)
|
|
||||||
{
|
|
||||||
fprintf (out, "%s ", tags[*sp]);
|
|
||||||
}
|
|
||||||
|
|
||||||
fputc ('.', out);
|
|
||||||
|
|
||||||
while (*sp > 0)
|
|
||||||
{
|
|
||||||
fprintf (out, " %s", tags[*sp]);
|
|
||||||
sp++;
|
|
||||||
}
|
|
||||||
|
|
||||||
fprintf (out, _(" (rule %d)"), rule);
|
|
||||||
fputc ('\n', out);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fputc ('\n', out);
|
if (snitems)
|
||||||
|
{
|
||||||
|
for (i = 0; i < snitems; i++)
|
||||||
|
{
|
||||||
|
short *sp;
|
||||||
|
short *sp1;
|
||||||
|
int rule;
|
||||||
|
|
||||||
|
sp1 = sp = ritem + sitems[i];
|
||||||
|
|
||||||
|
while (*sp > 0)
|
||||||
|
sp++;
|
||||||
|
|
||||||
|
rule = -(*sp);
|
||||||
|
fprintf (out, " %s -> ", tags[rule_table[rule].lhs]);
|
||||||
|
|
||||||
|
for (sp = ritem + rule_table[rule].rhs; sp < sp1; sp++)
|
||||||
|
fprintf (out, "%s ", tags[*sp]);
|
||||||
|
|
||||||
|
fputc ('.', out);
|
||||||
|
|
||||||
|
for (/* Nothing */; *sp > 0; ++sp)
|
||||||
|
fprintf (out, " %s", tags[*sp]);
|
||||||
|
|
||||||
|
fprintf (out, _(" (rule %d)"), rule);
|
||||||
|
fputc ('\n', out);
|
||||||
|
}
|
||||||
|
|
||||||
|
fputc ('\n', out);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
print_actions (FILE *out, int state)
|
print_actions (FILE *out, int state)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
int k;
|
|
||||||
int state1;
|
|
||||||
int symbol;
|
|
||||||
shifts *shiftp;
|
|
||||||
errs *errp;
|
|
||||||
reductions *redp;
|
|
||||||
int rule;
|
|
||||||
|
|
||||||
shiftp = shift_table[state];
|
shifts *shiftp = state_table[state].shifts;
|
||||||
redp = reduction_table[state];
|
reductions *redp = state_table[state].reductions;
|
||||||
errp = err_table[state];
|
errs *errp = state_table[state].errs;
|
||||||
|
|
||||||
if (!shiftp && !redp)
|
if (!shiftp->nshifts && !redp)
|
||||||
{
|
{
|
||||||
if (final_state == state)
|
if (final_state == state)
|
||||||
fprintf (out, _(" $default\taccept\n"));
|
fprintf (out, _(" $default\taccept\n"));
|
||||||
@@ -114,48 +111,34 @@ print_actions (FILE *out, int state)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (shiftp)
|
for (i = 0; i < shiftp->nshifts; i++)
|
||||||
{
|
if (!SHIFT_IS_DISABLED (shiftp, i))
|
||||||
k = shiftp->nshifts;
|
{
|
||||||
|
int state1 = shiftp->shifts[i];
|
||||||
|
int symbol = state_table[state1].accessing_symbol;
|
||||||
|
/* The following line used to be turned off. */
|
||||||
|
if (ISVAR (symbol))
|
||||||
|
break;
|
||||||
|
if (symbol == 0) /* I.e. strcmp(tags[symbol],"$")==0 */
|
||||||
|
fprintf (out,
|
||||||
|
_(" $ \tgo to state %d\n"), state1);
|
||||||
|
else
|
||||||
|
fprintf (out,
|
||||||
|
_(" %-4s\tshift, and go to state %d\n"),
|
||||||
|
tags[symbol], state1);
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 0; i < k; i++)
|
if (i > 0)
|
||||||
{
|
fputc ('\n', out);
|
||||||
if (!shiftp->shifts[i])
|
|
||||||
continue;
|
|
||||||
state1 = shiftp->shifts[i];
|
|
||||||
symbol = accessing_symbol[state1];
|
|
||||||
/* The following line used to be turned off. */
|
|
||||||
if (ISVAR (symbol))
|
|
||||||
break;
|
|
||||||
if (symbol == 0) /* I.e. strcmp(tags[symbol],"$")==0 */
|
|
||||||
fprintf (out,
|
|
||||||
_(" $ \tgo to state %d\n"), state1);
|
|
||||||
else
|
|
||||||
fprintf (out,
|
|
||||||
_(" %-4s\tshift, and go to state %d\n"),
|
|
||||||
tags[symbol], state1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (i > 0)
|
|
||||||
fputc ('\n', out);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
i = 0;
|
|
||||||
k = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (errp)
|
if (errp)
|
||||||
{
|
{
|
||||||
int j, nerrs;
|
int j;
|
||||||
|
for (j = 0; j < errp->nerrs; j++)
|
||||||
nerrs = errp->nerrs;
|
|
||||||
|
|
||||||
for (j = 0; j < nerrs; j++)
|
|
||||||
{
|
{
|
||||||
if (!errp->errs[j])
|
int symbol = errp->errs[j];
|
||||||
|
if (!symbol)
|
||||||
continue;
|
continue;
|
||||||
symbol = errp->errs[j];
|
|
||||||
fprintf (out, _(" %-4s\terror (nonassociative)\n"),
|
fprintf (out, _(" %-4s\terror (nonassociative)\n"),
|
||||||
tags[symbol]);
|
tags[symbol]);
|
||||||
}
|
}
|
||||||
@@ -164,29 +147,28 @@ print_actions (FILE *out, int state)
|
|||||||
fputc ('\n', out);
|
fputc ('\n', out);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (consistent[state] && redp)
|
if (state_table[state].consistent && redp)
|
||||||
{
|
{
|
||||||
rule = redp->rules[0];
|
int rule = redp->rules[0];
|
||||||
symbol = rlhs[rule];
|
int symbol = rule_table[rule].lhs;
|
||||||
fprintf (out, _(" $default\treduce using rule %d (%s)\n\n"),
|
fprintf (out, _(" $default\treduce using rule %d (%s)\n\n"),
|
||||||
rule, tags[symbol]);
|
rule, tags[symbol]);
|
||||||
}
|
}
|
||||||
else if (redp)
|
else if (redp)
|
||||||
{
|
{
|
||||||
print_reductions (state);
|
print_reductions (out, state);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i < k)
|
if (i < shiftp->nshifts)
|
||||||
{
|
{
|
||||||
for (; i < k; i++)
|
for (; i < shiftp->nshifts; i++)
|
||||||
{
|
if (!SHIFT_IS_DISABLED (shiftp, i))
|
||||||
if (!shiftp->shifts[i])
|
{
|
||||||
continue;
|
int state1 = shiftp->shifts[i];
|
||||||
state1 = shiftp->shifts[i];
|
int symbol = state_table[state1].accessing_symbol;
|
||||||
symbol = accessing_symbol[state1];
|
fprintf (out, _(" %-4s\tgo to state %d\n"),
|
||||||
fprintf (out, _(" %-4s\tgo to state %d\n"),
|
tags[symbol], state1);
|
||||||
tags[symbol], state1);
|
}
|
||||||
}
|
|
||||||
|
|
||||||
fputc ('\n', out);
|
fputc ('\n', out);
|
||||||
}
|
}
|
||||||
@@ -195,11 +177,11 @@ print_actions (FILE *out, int state)
|
|||||||
static void
|
static void
|
||||||
print_state (FILE *out, int state)
|
print_state (FILE *out, int state)
|
||||||
{
|
{
|
||||||
fputs ("\n\n", out);
|
|
||||||
fprintf (out, _("state %d"), state);
|
fprintf (out, _("state %d"), state);
|
||||||
fputs ("\n\n", out);
|
fputs ("\n\n", out);
|
||||||
print_core (out, state);
|
print_core (out, state);
|
||||||
print_actions (out, state);
|
print_actions (out, state);
|
||||||
|
fputs ("\n\n", out);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*-----------------------------------------.
|
/*-----------------------------------------.
|
||||||
@@ -226,22 +208,27 @@ print_grammar (FILE *out)
|
|||||||
int column = 0;
|
int column = 0;
|
||||||
|
|
||||||
/* rule # : LHS -> RHS */
|
/* rule # : LHS -> RHS */
|
||||||
fprintf (out, "\n%s\n", _("Grammar"));
|
fprintf (out, "%s\n\n", _("Grammar"));
|
||||||
|
fprintf (out, " %s\n", _("Number, Line, Rule"));
|
||||||
for (i = 1; i <= nrules; i++)
|
for (i = 1; i <= nrules; i++)
|
||||||
/* Don't print rules disabled in reduce_grammar_tables. */
|
/* Don't print rules disabled in reduce_grammar_tables. */
|
||||||
if (rlhs[i] >= 0)
|
if (rule_table[i].useful)
|
||||||
{
|
{
|
||||||
fprintf (out, _("rule %-4d %s ->"), i, tags[rlhs[i]]);
|
fprintf (out, _(" %3d %3d %s ->"),
|
||||||
rule = &ritem[rrhs[i]];
|
i, rule_table[i].line, tags[rule_table[i].lhs]);
|
||||||
|
rule = &ritem[rule_table[i].rhs];
|
||||||
if (*rule > 0)
|
if (*rule > 0)
|
||||||
while (*rule > 0)
|
while (*rule > 0)
|
||||||
fprintf (out, " %s", tags[*rule++]);
|
fprintf (out, " %s", tags[*rule++]);
|
||||||
else
|
else
|
||||||
fprintf (out, " /* %s */\n", _("empty"));
|
fprintf (out, " /* %s */", _("empty"));
|
||||||
|
fputc ('\n', out);
|
||||||
}
|
}
|
||||||
|
fputs ("\n\n", out);
|
||||||
|
|
||||||
|
|
||||||
/* TERMINAL (type #) : rule #s terminal is on RHS */
|
/* TERMINAL (type #) : rule #s terminal is on RHS */
|
||||||
fprintf (out, "\n%s\n\n", _("Terminals, with rules where they appear"));
|
fprintf (out, "%s\n\n", _("Terminals, with rules where they appear"));
|
||||||
fprintf (out, "%s (-1)\n", tags[0]);
|
fprintf (out, "%s (-1)\n", tags[0]);
|
||||||
|
|
||||||
for (i = 0; i <= max_user_token_number; i++)
|
for (i = 0; i <= max_user_token_number; i++)
|
||||||
@@ -254,7 +241,7 @@ print_grammar (FILE *out)
|
|||||||
sprintf (buffer, " (%d)", i);
|
sprintf (buffer, " (%d)", i);
|
||||||
|
|
||||||
for (j = 1; j <= nrules; j++)
|
for (j = 1; j <= nrules; j++)
|
||||||
for (rule = &ritem[rrhs[j]]; *rule > 0; rule++)
|
for (rule = &ritem[rule_table[j].rhs]; *rule > 0; rule++)
|
||||||
if (*rule == token_translations[i])
|
if (*rule == token_translations[i])
|
||||||
{
|
{
|
||||||
END_TEST (65);
|
END_TEST (65);
|
||||||
@@ -263,18 +250,19 @@ print_grammar (FILE *out)
|
|||||||
}
|
}
|
||||||
fprintf (out, "%s\n", buffer);
|
fprintf (out, "%s\n", buffer);
|
||||||
}
|
}
|
||||||
|
fputs ("\n\n", out);
|
||||||
|
|
||||||
fprintf (out, "\n%s\n\n",
|
|
||||||
_("Nonterminals, with rules where they appear"));
|
fprintf (out, "%s\n\n", _("Nonterminals, with rules where they appear"));
|
||||||
for (i = ntokens; i <= nsyms - 1; i++)
|
for (i = ntokens; i <= nsyms - 1; i++)
|
||||||
{
|
{
|
||||||
int left_count = 0, right_count = 0;
|
int left_count = 0, right_count = 0;
|
||||||
|
|
||||||
for (j = 1; j <= nrules; j++)
|
for (j = 1; j <= nrules; j++)
|
||||||
{
|
{
|
||||||
if (rlhs[j] == i)
|
if (rule_table[j].lhs == i)
|
||||||
left_count++;
|
left_count++;
|
||||||
for (rule = &ritem[rrhs[j]]; *rule > 0; rule++)
|
for (rule = &ritem[rule_table[j].rhs]; *rule > 0; rule++)
|
||||||
if (*rule == i)
|
if (*rule == i)
|
||||||
{
|
{
|
||||||
right_count++;
|
right_count++;
|
||||||
@@ -296,7 +284,7 @@ print_grammar (FILE *out)
|
|||||||
for (j = 1; j <= nrules; j++)
|
for (j = 1; j <= nrules; j++)
|
||||||
{
|
{
|
||||||
END_TEST (65);
|
END_TEST (65);
|
||||||
if (rlhs[j] == i)
|
if (rule_table[j].lhs == i)
|
||||||
sprintf (buffer + strlen (buffer), " %d", j);
|
sprintf (buffer + strlen (buffer), " %d", j);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -309,7 +297,7 @@ print_grammar (FILE *out)
|
|||||||
sprintf (buffer + strlen (buffer), _(" on right:"));
|
sprintf (buffer + strlen (buffer), _(" on right:"));
|
||||||
for (j = 1; j <= nrules; j++)
|
for (j = 1; j <= nrules; j++)
|
||||||
{
|
{
|
||||||
for (rule = &ritem[rrhs[j]]; *rule > 0; rule++)
|
for (rule = &ritem[rule_table[j].rhs]; *rule > 0; rule++)
|
||||||
if (*rule == i)
|
if (*rule == i)
|
||||||
{
|
{
|
||||||
END_TEST (65);
|
END_TEST (65);
|
||||||
@@ -320,6 +308,7 @@ print_grammar (FILE *out)
|
|||||||
}
|
}
|
||||||
fprintf (out, "%s\n", buffer);
|
fprintf (out, "%s\n", buffer);
|
||||||
}
|
}
|
||||||
|
fputs ("\n\n", out);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -335,14 +324,23 @@ print_results (void)
|
|||||||
|
|
||||||
size_t size = obstack_object_size (&output_obstack);
|
size_t size = obstack_object_size (&output_obstack);
|
||||||
fwrite (obstack_finish (&output_obstack), 1, size, out);
|
fwrite (obstack_finish (&output_obstack), 1, size, out);
|
||||||
|
if (size)
|
||||||
|
fputs ("\n\n", out);
|
||||||
|
|
||||||
if (any_conflicts)
|
reduce_output (out);
|
||||||
print_conflicts (out);
|
conflicts_output (out);
|
||||||
|
|
||||||
print_grammar (out);
|
print_grammar (out);
|
||||||
|
|
||||||
|
/* New experimental feature: output all the items of a state,
|
||||||
|
not only its kernel. Requires to run closure, which need
|
||||||
|
memory allocation/deallocation. */
|
||||||
|
if (trace_flag)
|
||||||
|
new_closure (nitems);
|
||||||
for (i = 0; i < nstates; i++)
|
for (i = 0; i < nstates; i++)
|
||||||
print_state (out, i);
|
print_state (out, i);
|
||||||
|
if (trace_flag)
|
||||||
|
free_closure ();
|
||||||
|
|
||||||
xfclose (out);
|
xfclose (out);
|
||||||
}
|
}
|
||||||
|
|||||||
+84
-121
@@ -31,42 +31,25 @@
|
|||||||
#include "obstack.h"
|
#include "obstack.h"
|
||||||
#include "print_graph.h"
|
#include "print_graph.h"
|
||||||
#include "vcg.h"
|
#include "vcg.h"
|
||||||
#include "quotearg.h"
|
|
||||||
|
|
||||||
static graph_t graph;
|
static graph_t graph;
|
||||||
static FILE *fgraph = NULL;
|
static FILE *fgraph = NULL;
|
||||||
|
|
||||||
static size_t node_output_size = 0;
|
|
||||||
|
|
||||||
/* Return an unambiguous printable representated, allocated in slot 0,
|
|
||||||
for NAME, suitable for C strings. */
|
|
||||||
static char const *
|
|
||||||
quote (char const *name)
|
|
||||||
{
|
|
||||||
return quotearg_n_style (0, escape_quoting_style, name);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* This part will construct the label of nodes. */
|
/* This part will construct the label of nodes. */
|
||||||
static void
|
static void
|
||||||
print_core (int state, struct obstack *node_obstack)
|
print_core (int state, struct obstack *node_obstack)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
int k;
|
core *statep = state_table[state].state;
|
||||||
int rule;
|
|
||||||
core *statep;
|
|
||||||
short *sp;
|
|
||||||
short *sp1;
|
|
||||||
|
|
||||||
statep = state_table[state];
|
if (!statep->nitems)
|
||||||
k = statep->nitems;
|
|
||||||
|
|
||||||
if (k == 0)
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
for (i = 0; i < k; i++)
|
for (i = 0; i < statep->nitems; i++)
|
||||||
{
|
{
|
||||||
if (i)
|
short *sp;
|
||||||
obstack_sgrow (node_obstack, "\\n");
|
short *sp1;
|
||||||
|
int rule;
|
||||||
|
|
||||||
sp1 = sp = ritem + statep->items[i];
|
sp1 = sp = ritem + statep->items[i];
|
||||||
|
|
||||||
@@ -75,87 +58,75 @@ print_core (int state, struct obstack *node_obstack)
|
|||||||
|
|
||||||
rule = -(*sp);
|
rule = -(*sp);
|
||||||
|
|
||||||
|
if (i)
|
||||||
|
obstack_1grow (node_obstack, '\n');
|
||||||
obstack_fgrow1 (node_obstack, "%d: ", rule);
|
obstack_fgrow1 (node_obstack, "%d: ", rule);
|
||||||
obstack_fgrow1 (node_obstack, " %s -> ", quote (tags[rlhs[rule]]));
|
obstack_fgrow1 (node_obstack, " %s -> ",
|
||||||
|
tags[rule_table[rule].lhs]);
|
||||||
|
|
||||||
for (sp = ritem + rrhs[rule]; sp < sp1; sp++)
|
for (sp = ritem + rule_table[rule].rhs; sp < sp1; sp++)
|
||||||
obstack_fgrow1 (node_obstack, "%s ", quote (tags[*sp]));
|
obstack_fgrow1 (node_obstack, "%s ", tags[*sp]);
|
||||||
|
|
||||||
obstack_1grow (node_obstack, '.');
|
obstack_1grow (node_obstack, '.');
|
||||||
|
|
||||||
while (*sp > 0)
|
for (/* Nothing */; *sp > 0; ++sp)
|
||||||
obstack_fgrow1 (node_obstack, " %s", quote (tags[*sp++]));
|
obstack_fgrow1 (node_obstack, " %s", tags[*sp]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Output in graph_obstack edges specifications in incidence with current
|
|
||||||
node. */
|
/*---------------------------------------------------------------.
|
||||||
|
| Output in graph_obstack edges specifications in incidence with |
|
||||||
|
| current node. |
|
||||||
|
`---------------------------------------------------------------*/
|
||||||
|
|
||||||
static void
|
static void
|
||||||
print_actions (int state, const char *node_name, struct obstack *node_obstack)
|
print_actions (int state, const char *node_name)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
int k;
|
|
||||||
int state1;
|
shifts *shiftp = state_table[state].shifts;
|
||||||
int symbol;
|
reductions *redp = state_table[state].reductions;
|
||||||
shifts *shiftp;
|
#if 0
|
||||||
errs *errp;
|
errs *errp = err_table[state];
|
||||||
reductions *redp;
|
#endif
|
||||||
int rule;
|
|
||||||
static char buff[10];
|
static char buff[10];
|
||||||
edge_t edge;
|
edge_t edge;
|
||||||
|
|
||||||
shiftp = shift_table[state];
|
if (!shiftp->nshifts && !redp)
|
||||||
redp = reduction_table[state];
|
|
||||||
errp = err_table[state];
|
|
||||||
|
|
||||||
if (!shiftp && !redp)
|
|
||||||
{
|
{
|
||||||
|
#if 0
|
||||||
if (final_state == state)
|
if (final_state == state)
|
||||||
obstack_sgrow (node_obstack, "$default: accept");
|
obstack_sgrow (node_obstack, "$default: accept");
|
||||||
else
|
else
|
||||||
obstack_sgrow (node_obstack, "NO ACTIONS");
|
obstack_sgrow (node_obstack, "NO ACTIONS");
|
||||||
|
#endif
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (shiftp)
|
for (i = 0; i < shiftp->nshifts; i++)
|
||||||
{
|
if (!SHIFT_IS_DISABLED (shiftp, i))
|
||||||
k = shiftp->nshifts;
|
{
|
||||||
|
int state1 = shiftp->shifts[i];
|
||||||
|
int symbol = state_table[state1].accessing_symbol;
|
||||||
|
|
||||||
for (i = 0; i < k; i++)
|
new_edge (&edge);
|
||||||
{
|
|
||||||
if (!shiftp->shifts[i])
|
|
||||||
continue;
|
|
||||||
state1 = shiftp->shifts[i];
|
|
||||||
symbol = accessing_symbol[state1];
|
|
||||||
|
|
||||||
if (ISVAR (symbol))
|
if (state > state1)
|
||||||
break;
|
edge.type = back_edge;
|
||||||
|
open_edge (&edge, fgraph);
|
||||||
{
|
/* The edge source is the current node. */
|
||||||
new_edge (&edge);
|
edge.sourcename = node_name;
|
||||||
|
sprintf (buff, "%d", state1);
|
||||||
if (state > state1)
|
edge.targetname = buff;
|
||||||
edge.type = back_edge;
|
edge.color = (symbol == 0) ? red : blue;
|
||||||
open_edge (&edge, fgraph);
|
edge.label = tags[symbol];
|
||||||
/* The edge source is the current node. */
|
output_edge (&edge, fgraph);
|
||||||
edge.sourcename = node_name;
|
close_edge (fgraph);
|
||||||
sprintf (buff, "%d", state1);
|
}
|
||||||
edge.targetname = buff;
|
|
||||||
edge.color = (symbol == 0) ? red : blue;
|
|
||||||
/* FIXME: Be aware that quote uses static memory. The string
|
|
||||||
must be output immediately (which is the case here). */
|
|
||||||
edge.label = tags[symbol] ? quote (tags[symbol]) : NULL;
|
|
||||||
output_edge (&edge, fgraph);
|
|
||||||
close_edge (fgraph);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
i = 0;
|
|
||||||
k = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
#if 0
|
||||||
if (errp)
|
if (errp)
|
||||||
{
|
{
|
||||||
int j, nerrs;
|
int j, nerrs;
|
||||||
@@ -168,34 +139,36 @@ print_actions (int state, const char *node_name, struct obstack *node_obstack)
|
|||||||
continue;
|
continue;
|
||||||
symbol = errp->errs[j];
|
symbol = errp->errs[j];
|
||||||
/* If something has been added in the NODE_OBSTACK after
|
/* If something has been added in the NODE_OBSTACK after
|
||||||
the declaration of the label, then we need a `\n'. */
|
the declaration of the label, then we need a `\n'.
|
||||||
if (obstack_object_size (node_obstack) > node_output_size)
|
if (obstack_object_size (node_obstack) > node_output_size)
|
||||||
obstack_sgrow (node_obstack, "\\n");
|
obstack_sgrow (node_obstack, "\n");
|
||||||
|
*/
|
||||||
obstack_fgrow1 (node_obstack, _("%-4s\terror (nonassociative)"),
|
obstack_fgrow1 (node_obstack, _("%-4s\terror (nonassociative)"),
|
||||||
tags[symbol]);
|
tags[symbol]);
|
||||||
}
|
}
|
||||||
if (j > 0)
|
if (j > 0)
|
||||||
obstack_sgrow (node_obstack, "\\n");
|
obstack_1grow (node_obstack, '\n');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (consistent[state] && redp)
|
if (state_table[state].consistent && redp)
|
||||||
{
|
{
|
||||||
rule = redp->rules[0];
|
rule = redp->rules[0];
|
||||||
symbol = rlhs[rule];
|
symbol = rule_table[rule].lhs;
|
||||||
|
/*
|
||||||
if (obstack_object_size (node_obstack) > node_output_size)
|
if (obstack_object_size (node_obstack) > node_output_size)
|
||||||
obstack_sgrow (node_obstack, "\\n");
|
obstack_sgrow (node_obstack, "\n");
|
||||||
|
*/
|
||||||
obstack_fgrow2 (node_obstack, _("$default\treduce using rule %d (%s)"),
|
obstack_fgrow2 (node_obstack, _("$default\treduce using rule %d (%s)"),
|
||||||
rule, tags[symbol]);
|
rule, tags[symbol]);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if (i < k)
|
if (i < shiftp->nshifts)
|
||||||
{
|
for (; i < shiftp->nshifts; i++)
|
||||||
for (; i < k; i++)
|
if (!SHIFT_IS_DISABLED (shiftp, i))
|
||||||
{
|
{
|
||||||
if (!shiftp->shifts[i])
|
int state1 = shiftp->shifts[i];
|
||||||
continue;
|
int symbol = state_table[state1].accessing_symbol;
|
||||||
state1 = shiftp->shifts[i];
|
|
||||||
symbol = accessing_symbol[state1];
|
|
||||||
|
|
||||||
new_edge (&edge);
|
new_edge (&edge);
|
||||||
open_edge (&edge, fgraph);
|
open_edge (&edge, fgraph);
|
||||||
@@ -203,15 +176,18 @@ print_actions (int state, const char *node_name, struct obstack *node_obstack)
|
|||||||
sprintf (buff, "%d", state1);
|
sprintf (buff, "%d", state1);
|
||||||
edge.targetname = buff;
|
edge.targetname = buff;
|
||||||
edge.color = red;
|
edge.color = red;
|
||||||
edge.label = tags[symbol] ? quote (tags[symbol]) : NULL;
|
edge.label = tags[symbol];
|
||||||
output_edge (&edge, fgraph);
|
output_edge (&edge, fgraph);
|
||||||
close_edge (fgraph);
|
close_edge (fgraph);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Output in GRAPH_OBSTACK the current node specifications and edges
|
|
||||||
which go out from that node. */
|
/*-------------------------------------------------------------.
|
||||||
|
| Output in FGRAPH the current node specifications and exiting |
|
||||||
|
| edges. |
|
||||||
|
`-------------------------------------------------------------*/
|
||||||
|
|
||||||
static void
|
static void
|
||||||
print_state (int state)
|
print_state (int state)
|
||||||
{
|
{
|
||||||
@@ -219,35 +195,22 @@ print_state (int state)
|
|||||||
struct obstack node_obstack;
|
struct obstack node_obstack;
|
||||||
node_t node;
|
node_t node;
|
||||||
|
|
||||||
|
/* The labels of the nodes are their the items. */
|
||||||
obstack_init (&node_obstack);
|
obstack_init (&node_obstack);
|
||||||
new_node (&node); /* Set node attributs default value. */
|
new_node (&node);
|
||||||
sprintf (name, "%d", state);
|
sprintf (name, "%d", state);
|
||||||
node.title = name; /* Give a name to the node. */
|
node.title = name;
|
||||||
|
print_core (state, &node_obstack);
|
||||||
{
|
obstack_1grow (&node_obstack, '\0');
|
||||||
/* Here we begin to compute the node label. */
|
node.label = obstack_finish (&node_obstack);
|
||||||
obstack_sgrow (&node_obstack, "\t\tlabel:\t\""); /* Open Label */
|
|
||||||
|
|
||||||
/* Keep the size of NODE_OBSTACK before computing the label. It is
|
|
||||||
useful to format the label. */
|
|
||||||
node_output_size = obstack_object_size (&node_obstack);
|
|
||||||
|
|
||||||
/* Compute the labels of nodes on the fly. */
|
|
||||||
print_core (state, &node_obstack);
|
|
||||||
/* Compute edges and additionnal parts of node label. */
|
|
||||||
print_actions (state, node.title, &node_obstack);
|
|
||||||
|
|
||||||
obstack_sgrow (&node_obstack, "\"\n"); /* Close Label. */
|
|
||||||
}
|
|
||||||
|
|
||||||
open_node (fgraph);
|
open_node (fgraph);
|
||||||
/* Output a VCG formatted attributs list. */
|
|
||||||
output_node (&node, fgraph);
|
output_node (&node, fgraph);
|
||||||
/* Save the node label. */
|
|
||||||
fwrite (obstack_base (&node_obstack),
|
|
||||||
obstack_object_size (&node_obstack), 1, fgraph);
|
|
||||||
close_node (fgraph);
|
close_node (fgraph);
|
||||||
|
|
||||||
|
/* Output the edges. */
|
||||||
|
print_actions (state, name);
|
||||||
|
|
||||||
obstack_free (&node_obstack, 0);
|
obstack_free (&node_obstack, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -256,7 +219,7 @@ void
|
|||||||
print_graph (void)
|
print_graph (void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (!graph_flag)
|
if (!graph_flag)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -267,7 +230,7 @@ print_graph (void)
|
|||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
graph.smanhattan_edges = yes;
|
graph.smanhattan_edges = yes;
|
||||||
graph.manhattan_edges = yes;
|
graph.manhattan_edges = yes;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
graph.display_edge_labels = yes;
|
graph.display_edge_labels = yes;
|
||||||
@@ -285,8 +248,8 @@ print_graph (void)
|
|||||||
open_graph (fgraph);
|
open_graph (fgraph);
|
||||||
output_graph (&graph, fgraph);
|
output_graph (&graph, fgraph);
|
||||||
|
|
||||||
|
/* Output nodes and edges. */
|
||||||
for (i = 0; i < nstates; i++)
|
for (i = 0; i < nstates; i++)
|
||||||
/* Output nodes & edges. */
|
|
||||||
print_state (i);
|
print_state (i);
|
||||||
|
|
||||||
/* Close graph. */
|
/* Close graph. */
|
||||||
|
|||||||
+164
-131
@@ -1,5 +1,5 @@
|
|||||||
/* Input parser for bison
|
/* Input parser for bison
|
||||||
Copyright 1984, 1986, 1989, 1992, 1998, 2000
|
Copyright 1984, 1986, 1989, 1992, 1998, 2000, 2001
|
||||||
Free Software Foundation, Inc.
|
Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of Bison, the GNU Compiler Compiler.
|
This file is part of Bison, the GNU Compiler Compiler.
|
||||||
@@ -34,13 +34,11 @@
|
|||||||
#include "reader.h"
|
#include "reader.h"
|
||||||
#include "conflicts.h"
|
#include "conflicts.h"
|
||||||
|
|
||||||
/* Number of slots allocated (but not necessarily used yet) in `rline' */
|
|
||||||
static int rline_allocated;
|
|
||||||
|
|
||||||
typedef struct symbol_list
|
typedef struct symbol_list
|
||||||
{
|
{
|
||||||
struct symbol_list *next;
|
struct symbol_list *next;
|
||||||
bucket *sym;
|
bucket *sym;
|
||||||
|
int line;
|
||||||
bucket *ruleprec;
|
bucket *ruleprec;
|
||||||
}
|
}
|
||||||
symbol_list;
|
symbol_list;
|
||||||
@@ -64,6 +62,19 @@ static int lastprec;
|
|||||||
|
|
||||||
static bucket *errtoken;
|
static bucket *errtoken;
|
||||||
static bucket *undeftoken;
|
static bucket *undeftoken;
|
||||||
|
|
||||||
|
|
||||||
|
static symbol_list *
|
||||||
|
symbol_list_new (bucket *sym)
|
||||||
|
{
|
||||||
|
symbol_list *res = XMALLOC (symbol_list, 1);
|
||||||
|
res->next = NULL;
|
||||||
|
res->sym = sym;
|
||||||
|
res->line = lineno;
|
||||||
|
res->ruleprec = NULL;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*===================\
|
/*===================\
|
||||||
@@ -121,7 +132,7 @@ read_signed_integer (FILE *stream)
|
|||||||
`--------------------------------------------------------------*/
|
`--------------------------------------------------------------*/
|
||||||
|
|
||||||
static char *
|
static char *
|
||||||
get_type_name (int n, symbol_list * rule)
|
get_type_name (int n, symbol_list *rule)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
symbol_list *rp;
|
symbol_list *rp;
|
||||||
@@ -539,7 +550,8 @@ parse_token_decl (symbol_class what_is, symbol_class what_is_not)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
complain (_("`%s' is invalid in %s"),
|
complain (_("`%s' is invalid in %s"),
|
||||||
token_buffer, (what_is == token_sym) ? "%token" : "%nterm");
|
token_buffer,
|
||||||
|
(what_is == token_sym) ? "%token" : "%nterm");
|
||||||
skip_to_char ('%');
|
skip_to_char ('%');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -695,7 +707,6 @@ token_buffer);
|
|||||||
}
|
}
|
||||||
|
|
||||||
prev = t;
|
prev = t;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -712,6 +723,13 @@ parse_union_decl (void)
|
|||||||
{
|
{
|
||||||
int c;
|
int c;
|
||||||
int count = 0;
|
int count = 0;
|
||||||
|
const char *prologue = "\
|
||||||
|
#ifndef YYSTYPE\n\
|
||||||
|
typedef union";
|
||||||
|
const char *epilogue = "\
|
||||||
|
yystype;\n\
|
||||||
|
# define YYSTYPE yystype\n\
|
||||||
|
#endif\n";
|
||||||
|
|
||||||
if (typed)
|
if (typed)
|
||||||
complain (_("multiple %s declarations"), "%union");
|
complain (_("multiple %s declarations"), "%union");
|
||||||
@@ -724,9 +742,9 @@ parse_union_decl (void)
|
|||||||
else
|
else
|
||||||
obstack_1grow (&attrs_obstack, '\n');
|
obstack_1grow (&attrs_obstack, '\n');
|
||||||
|
|
||||||
obstack_sgrow (&attrs_obstack, "typedef union");
|
obstack_sgrow (&attrs_obstack, prologue);
|
||||||
if (defines_flag)
|
if (defines_flag)
|
||||||
obstack_sgrow (&defines_obstack, "typedef union");
|
obstack_sgrow (&defines_obstack, prologue);
|
||||||
|
|
||||||
c = getc (finput);
|
c = getc (finput);
|
||||||
|
|
||||||
@@ -761,9 +779,9 @@ parse_union_decl (void)
|
|||||||
count--;
|
count--;
|
||||||
if (count <= 0)
|
if (count <= 0)
|
||||||
{
|
{
|
||||||
obstack_sgrow (&attrs_obstack, " YYSTYPE;\n");
|
obstack_sgrow (&attrs_obstack, epilogue);
|
||||||
if (defines_flag)
|
if (defines_flag)
|
||||||
obstack_sgrow (&defines_obstack, " YYSTYPE;\n");
|
obstack_sgrow (&defines_obstack, epilogue);
|
||||||
/* JF don't choke on trailing semi */
|
/* JF don't choke on trailing semi */
|
||||||
c = skip_white_space ();
|
c = skip_white_space ();
|
||||||
if (c != ';')
|
if (c != ';')
|
||||||
@@ -821,7 +839,7 @@ parse_thong_decl (void)
|
|||||||
token_t token;
|
token_t token;
|
||||||
struct bucket *symbol;
|
struct bucket *symbol;
|
||||||
char *typename = 0;
|
char *typename = 0;
|
||||||
int usrtoknum;
|
int usrtoknum = SUNDEF;
|
||||||
|
|
||||||
token = lex (); /* fetch typename or first token */
|
token = lex (); /* fetch typename or first token */
|
||||||
if (token == tok_typename)
|
if (token == tok_typename)
|
||||||
@@ -852,8 +870,6 @@ parse_thong_decl (void)
|
|||||||
usrtoknum = numval;
|
usrtoknum = numval;
|
||||||
token = lex (); /* okay, did number, now get literal */
|
token = lex (); /* okay, did number, now get literal */
|
||||||
}
|
}
|
||||||
else
|
|
||||||
usrtoknum = 0;
|
|
||||||
|
|
||||||
/* process literal string token */
|
/* process literal string token */
|
||||||
|
|
||||||
@@ -875,10 +891,11 @@ parse_thong_decl (void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------------.
|
/*------------------------------------------------------------------.
|
||||||
| Parse a double quoted parameter. It was used for %{source,header}_extension. |
|
| Parse a double quoted parameter. It was used for |
|
||||||
| For the moment, It is not used since extension features have been removed. |
|
| %{source,header}_extension. For the moment, It is not used since |
|
||||||
`-----------------------------------------------------------------------------*/
|
| extension features have been removed. |
|
||||||
|
`------------------------------------------------------------------*/
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
|
|
||||||
@@ -938,16 +955,13 @@ parse_dquoted_param (const char *from)
|
|||||||
static void
|
static void
|
||||||
read_declarations (void)
|
read_declarations (void)
|
||||||
{
|
{
|
||||||
int c;
|
|
||||||
int tok;
|
|
||||||
|
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
c = skip_white_space ();
|
int c = skip_white_space ();
|
||||||
|
|
||||||
if (c == '%')
|
if (c == '%')
|
||||||
{
|
{
|
||||||
tok = parse_percent_token ();
|
token_t tok = parse_percent_token ();
|
||||||
|
|
||||||
switch (tok)
|
switch (tok)
|
||||||
{
|
{
|
||||||
@@ -1001,6 +1015,13 @@ read_declarations (void)
|
|||||||
case tok_noop:
|
case tok_noop:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case tok_stropt:
|
||||||
|
case tok_intopt:
|
||||||
|
case tok_obsolete:
|
||||||
|
abort ();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case tok_illegal:
|
||||||
default:
|
default:
|
||||||
complain (_("unrecognized: %s"), token_buffer);
|
complain (_("unrecognized: %s"), token_buffer);
|
||||||
skip_to_char ('%');
|
skip_to_char ('%');
|
||||||
@@ -1206,20 +1227,6 @@ copy_guard (symbol_list *rule, int stack_offset)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
|
||||||
record_rule_line (void)
|
|
||||||
{
|
|
||||||
/* Record each rule's source line number in rline table. */
|
|
||||||
|
|
||||||
if (nrules >= rline_allocated)
|
|
||||||
{
|
|
||||||
rline_allocated = nrules * 2;
|
|
||||||
rline = XREALLOC (rline, short, rline_allocated);
|
|
||||||
}
|
|
||||||
rline[nrules] = lineno;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*-------------------------------------------------------------------.
|
/*-------------------------------------------------------------------.
|
||||||
| Generate a dummy symbol, a nonterminal, whose name cannot conflict |
|
| Generate a dummy symbol, a nonterminal, whose name cannot conflict |
|
||||||
| with the user's names. |
|
| with the user's names. |
|
||||||
@@ -1362,10 +1369,7 @@ readgram (void)
|
|||||||
nrules++;
|
nrules++;
|
||||||
nitems++;
|
nitems++;
|
||||||
|
|
||||||
record_rule_line ();
|
p = symbol_list_new (lhs);
|
||||||
|
|
||||||
p = XCALLOC (symbol_list, 1);
|
|
||||||
p->sym = lhs;
|
|
||||||
|
|
||||||
crule1 = p1;
|
crule1 = p1;
|
||||||
if (p1)
|
if (p1)
|
||||||
@@ -1427,36 +1431,35 @@ readgram (void)
|
|||||||
non-terminal. */
|
non-terminal. */
|
||||||
if (action_flag)
|
if (action_flag)
|
||||||
{
|
{
|
||||||
bucket *sdummy;
|
|
||||||
|
|
||||||
/* Since the action was written out with this rule's
|
/* Since the action was written out with this rule's
|
||||||
number, we must give the new rule this number by
|
number, we must give the new rule this number by
|
||||||
inserting the new rule before it. */
|
inserting the new rule before it. */
|
||||||
|
|
||||||
/* Make a dummy nonterminal, a gensym. */
|
/* Make a dummy nonterminal, a gensym. */
|
||||||
sdummy = gensym ();
|
bucket *sdummy = gensym ();
|
||||||
|
|
||||||
/* Make a new rule, whose body is empty,
|
/* Make a new rule, whose body is empty, before the
|
||||||
before the current one, so that the action
|
current one, so that the action just read can
|
||||||
just read can belong to it. */
|
belong to it. */
|
||||||
nrules++;
|
nrules++;
|
||||||
nitems++;
|
nitems++;
|
||||||
record_rule_line ();
|
p = symbol_list_new (sdummy);
|
||||||
p = XCALLOC (symbol_list, 1);
|
/* Attach its lineno to that of the host rule. */
|
||||||
|
p->line = crule->line;
|
||||||
if (crule1)
|
if (crule1)
|
||||||
crule1->next = p;
|
crule1->next = p;
|
||||||
else
|
else
|
||||||
grammar = p;
|
grammar = p;
|
||||||
p->sym = sdummy;
|
/* End of the rule. */
|
||||||
crule1 = XCALLOC (symbol_list, 1);
|
crule1 = symbol_list_new (NULL);
|
||||||
p->next = crule1;
|
|
||||||
crule1->next = crule;
|
crule1->next = crule;
|
||||||
|
|
||||||
|
p->next = crule1;
|
||||||
|
|
||||||
/* Insert the dummy generated by that rule into this
|
/* Insert the dummy generated by that rule into this
|
||||||
rule. */
|
rule. */
|
||||||
nitems++;
|
nitems++;
|
||||||
p = XCALLOC (symbol_list, 1);
|
p = symbol_list_new (sdummy);
|
||||||
p->sym = sdummy;
|
|
||||||
p1->next = p;
|
p1->next = p;
|
||||||
p1 = p;
|
p1 = p;
|
||||||
|
|
||||||
@@ -1466,8 +1469,7 @@ readgram (void)
|
|||||||
if (t == tok_identifier)
|
if (t == tok_identifier)
|
||||||
{
|
{
|
||||||
nitems++;
|
nitems++;
|
||||||
p = XCALLOC (symbol_list, 1);
|
p = symbol_list_new (symval);
|
||||||
p->sym = symval;
|
|
||||||
p1->next = p;
|
p1->next = p;
|
||||||
p1 = p;
|
p1 = p;
|
||||||
}
|
}
|
||||||
@@ -1481,7 +1483,7 @@ readgram (void)
|
|||||||
} /* end of read rhs of rule */
|
} /* end of read rhs of rule */
|
||||||
|
|
||||||
/* Put an empty link in the list to mark the end of this rule */
|
/* Put an empty link in the list to mark the end of this rule */
|
||||||
p = XCALLOC (symbol_list, 1);
|
p = symbol_list_new (NULL);
|
||||||
p1->next = p;
|
p1->next = p;
|
||||||
p1 = p;
|
p1 = p;
|
||||||
|
|
||||||
@@ -1663,6 +1665,89 @@ output_token_defines (struct obstack *oout)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*--------------------.
|
||||||
|
| Output the header. |
|
||||||
|
`--------------------*/
|
||||||
|
|
||||||
|
static void
|
||||||
|
symbols_output (void)
|
||||||
|
{
|
||||||
|
if (defines_flag)
|
||||||
|
{
|
||||||
|
output_token_defines (&defines_obstack);
|
||||||
|
|
||||||
|
if (!pure_parser)
|
||||||
|
{
|
||||||
|
if (spec_name_prefix)
|
||||||
|
obstack_fgrow1 (&defines_obstack, "\nextern YYSTYPE %slval;\n",
|
||||||
|
spec_name_prefix);
|
||||||
|
else
|
||||||
|
obstack_sgrow (&defines_obstack,
|
||||||
|
"\nextern YYSTYPE yylval;\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (semantic_parser)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = ntokens; i < nsyms; i++)
|
||||||
|
{
|
||||||
|
/* don't make these for dummy nonterminals made by gensym. */
|
||||||
|
if (*tags[i] != '@')
|
||||||
|
obstack_fgrow2 (&defines_obstack,
|
||||||
|
"# define\tNT%s\t%d\n", tags[i], i);
|
||||||
|
}
|
||||||
|
#if 0
|
||||||
|
/* `fdefines' is now a temporary file, so we need to copy its
|
||||||
|
contents in `done', so we can't close it here. */
|
||||||
|
fclose (fdefines);
|
||||||
|
fdefines = NULL;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------.
|
||||||
|
| Set TOKEN_TRANSLATIONS. Check that no two symbols share the same |
|
||||||
|
| number. |
|
||||||
|
`------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
static void
|
||||||
|
token_translations_init (void)
|
||||||
|
{
|
||||||
|
bucket *bp = NULL;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
token_translations = XCALLOC (short, max_user_token_number + 1);
|
||||||
|
|
||||||
|
/* Initialize all entries for literal tokens to 2, the internal
|
||||||
|
token number for $undefined., which represents all invalid
|
||||||
|
inputs. */
|
||||||
|
for (i = 0; i <= max_user_token_number; i++)
|
||||||
|
token_translations[i] = 2;
|
||||||
|
|
||||||
|
for (bp = firstsymbol; bp; bp = bp->next)
|
||||||
|
{
|
||||||
|
/* Non-terminal? */
|
||||||
|
if (bp->value >= ntokens)
|
||||||
|
continue;
|
||||||
|
/* A token string alias? */
|
||||||
|
if (bp->user_token_number == SALIAS)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
assert (bp->user_token_number != SUNDEF);
|
||||||
|
|
||||||
|
/* A token which translation has already been set? */
|
||||||
|
if (token_translations[bp->user_token_number] != 2)
|
||||||
|
complain (_("tokens %s and %s both assigned number %d"),
|
||||||
|
tags[token_translations[bp->user_token_number]],
|
||||||
|
bp->tag, bp->user_token_number);
|
||||||
|
token_translations[bp->user_token_number] = bp->value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*------------------------------------------------------------------.
|
/*------------------------------------------------------------------.
|
||||||
| Assign symbol numbers, and write definition of token names into |
|
| Assign symbol numbers, and write definition of token names into |
|
||||||
| FDEFINES. Set up vectors TAGS and SPREC of names and precedences |
|
| FDEFINES. Set up vectors TAGS and SPREC of names and precedences |
|
||||||
@@ -1674,20 +1759,19 @@ packsymbols (void)
|
|||||||
{
|
{
|
||||||
bucket *bp = NULL;
|
bucket *bp = NULL;
|
||||||
int tokno = 1;
|
int tokno = 1;
|
||||||
int i, j;
|
|
||||||
int last_user_token_number;
|
int last_user_token_number;
|
||||||
static char DOLLAR[] = "$";
|
static char DOLLAR[] = "$";
|
||||||
|
|
||||||
/* int lossage = 0; JF set but not used */
|
|
||||||
|
|
||||||
tags = XCALLOC (char *, nsyms + 1);
|
tags = XCALLOC (char *, nsyms + 1);
|
||||||
tags[0] = DOLLAR;
|
|
||||||
user_toknums = XCALLOC (short, nsyms + 1);
|
user_toknums = XCALLOC (short, nsyms + 1);
|
||||||
user_toknums[0] = 0;
|
|
||||||
|
|
||||||
sprec = XCALLOC (short, nsyms);
|
sprec = XCALLOC (short, nsyms);
|
||||||
sassoc = XCALLOC (short, nsyms);
|
sassoc = XCALLOC (short, nsyms);
|
||||||
|
|
||||||
|
/* The EOF token. */
|
||||||
|
tags[0] = DOLLAR;
|
||||||
|
user_toknums[0] = 0;
|
||||||
|
|
||||||
max_user_token_number = 256;
|
max_user_token_number = 256;
|
||||||
last_user_token_number = 256;
|
last_user_token_number = 256;
|
||||||
|
|
||||||
@@ -1740,7 +1824,7 @@ packsymbols (void)
|
|||||||
|
|
||||||
if (bp->class == token_sym)
|
if (bp->class == token_sym)
|
||||||
{
|
{
|
||||||
if (!bp->user_token_number)
|
if (bp->user_token_number == SUNDEF)
|
||||||
bp->user_token_number = ++last_user_token_number;
|
bp->user_token_number = ++last_user_token_number;
|
||||||
if (bp->user_token_number > max_user_token_number)
|
if (bp->user_token_number > max_user_token_number)
|
||||||
max_user_token_number = bp->user_token_number;
|
max_user_token_number = bp->user_token_number;
|
||||||
@@ -1752,26 +1836,7 @@ packsymbols (void)
|
|||||||
sassoc[bp->value] = bp->assoc;
|
sassoc[bp->value] = bp->assoc;
|
||||||
}
|
}
|
||||||
|
|
||||||
token_translations = XCALLOC (short, max_user_token_number + 1);
|
token_translations_init ();
|
||||||
|
|
||||||
/* initialize all entries for literal tokens to 2, the internal
|
|
||||||
token number for $undefined., which represents all invalid
|
|
||||||
inputs. */
|
|
||||||
for (j = 0; j <= max_user_token_number; j++)
|
|
||||||
token_translations[j] = 2;
|
|
||||||
|
|
||||||
for (bp = firstsymbol; bp; bp = bp->next)
|
|
||||||
{
|
|
||||||
if (bp->value >= ntokens)
|
|
||||||
continue; /* non-terminal */
|
|
||||||
if (bp->user_token_number == SALIAS)
|
|
||||||
continue;
|
|
||||||
if (token_translations[bp->user_token_number] != 2)
|
|
||||||
complain (_("tokens %s and %s both assigned number %d"),
|
|
||||||
tags[token_translations[bp->user_token_number]],
|
|
||||||
bp->tag, bp->user_token_number);
|
|
||||||
token_translations[bp->user_token_number] = bp->value;
|
|
||||||
}
|
|
||||||
|
|
||||||
error_token_number = errtoken->value;
|
error_token_number = errtoken->value;
|
||||||
|
|
||||||
@@ -1784,36 +1849,6 @@ packsymbols (void)
|
|||||||
fatal (_("the start symbol %s is a token"), startval->tag);
|
fatal (_("the start symbol %s is a token"), startval->tag);
|
||||||
|
|
||||||
start_symbol = startval->value;
|
start_symbol = startval->value;
|
||||||
|
|
||||||
if (defines_flag)
|
|
||||||
{
|
|
||||||
output_token_defines (&defines_obstack);
|
|
||||||
|
|
||||||
if (!pure_parser)
|
|
||||||
{
|
|
||||||
if (spec_name_prefix)
|
|
||||||
obstack_fgrow1 (&defines_obstack, "\nextern YYSTYPE %slval;\n",
|
|
||||||
spec_name_prefix);
|
|
||||||
else
|
|
||||||
obstack_sgrow (&defines_obstack,
|
|
||||||
"\nextern YYSTYPE yylval;\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (semantic_parser)
|
|
||||||
for (i = ntokens; i < nsyms; i++)
|
|
||||||
{
|
|
||||||
/* don't make these for dummy nonterminals made by gensym. */
|
|
||||||
if (*tags[i] != '@')
|
|
||||||
obstack_fgrow2 (&defines_obstack,
|
|
||||||
"# define\tNT%s\t%d\n", tags[i], i);
|
|
||||||
}
|
|
||||||
#if 0
|
|
||||||
/* `fdefines' is now a temporary file, so we need to copy its
|
|
||||||
contents in `done', so we can't close it here. */
|
|
||||||
fclose (fdefines);
|
|
||||||
fdefines = NULL;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1829,14 +1864,8 @@ packgram (void)
|
|||||||
int ruleno;
|
int ruleno;
|
||||||
symbol_list *p;
|
symbol_list *p;
|
||||||
|
|
||||||
bucket *ruleprec;
|
|
||||||
|
|
||||||
ritem = XCALLOC (short, nitems + 1);
|
ritem = XCALLOC (short, nitems + 1);
|
||||||
rlhs = XCALLOC (short, nrules) - 1;
|
rule_table = XCALLOC (rule_t, nrules) - 1;
|
||||||
rrhs = XCALLOC (short, nrules) - 1;
|
|
||||||
rprec = XCALLOC (short, nrules) - 1;
|
|
||||||
rprecsym = XCALLOC (short, nrules) - 1;
|
|
||||||
rassoc = XCALLOC (short, nrules) - 1;
|
|
||||||
|
|
||||||
itemno = 0;
|
itemno = 0;
|
||||||
ruleno = 1;
|
ruleno = 1;
|
||||||
@@ -1844,9 +1873,11 @@ packgram (void)
|
|||||||
p = grammar;
|
p = grammar;
|
||||||
while (p)
|
while (p)
|
||||||
{
|
{
|
||||||
rlhs[ruleno] = p->sym->value;
|
bucket *ruleprec = p->ruleprec;
|
||||||
rrhs[ruleno] = itemno;
|
rule_table[ruleno].lhs = p->sym->value;
|
||||||
ruleprec = p->ruleprec;
|
rule_table[ruleno].rhs = itemno;
|
||||||
|
rule_table[ruleno].line = p->line;
|
||||||
|
rule_table[ruleno].useful = TRUE;
|
||||||
|
|
||||||
p = p->next;
|
p = p->next;
|
||||||
while (p && p->sym)
|
while (p && p->sym)
|
||||||
@@ -1856,8 +1887,8 @@ packgram (void)
|
|||||||
of the last token in it. */
|
of the last token in it. */
|
||||||
if (p->sym->class == token_sym)
|
if (p->sym->class == token_sym)
|
||||||
{
|
{
|
||||||
rprec[ruleno] = p->sym->prec;
|
rule_table[ruleno].prec = p->sym->prec;
|
||||||
rassoc[ruleno] = p->sym->assoc;
|
rule_table[ruleno].assoc = p->sym->assoc;
|
||||||
}
|
}
|
||||||
if (p)
|
if (p)
|
||||||
p = p->next;
|
p = p->next;
|
||||||
@@ -1867,9 +1898,9 @@ packgram (void)
|
|||||||
the specified symbol's precedence replaces the default. */
|
the specified symbol's precedence replaces the default. */
|
||||||
if (ruleprec)
|
if (ruleprec)
|
||||||
{
|
{
|
||||||
rprec[ruleno] = ruleprec->prec;
|
rule_table[ruleno].prec = ruleprec->prec;
|
||||||
rassoc[ruleno] = ruleprec->assoc;
|
rule_table[ruleno].assoc = ruleprec->assoc;
|
||||||
rprecsym[ruleno] = ruleprec->value;
|
rule_table[ruleno].precsym = ruleprec->value;
|
||||||
}
|
}
|
||||||
|
|
||||||
ritem[itemno++] = -ruleno;
|
ritem[itemno++] = -ruleno;
|
||||||
@@ -1880,6 +1911,9 @@ packgram (void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
ritem[itemno] = 0;
|
ritem[itemno] = 0;
|
||||||
|
|
||||||
|
if (trace_flag)
|
||||||
|
ritem_print (stderr);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*-------------------------------------------------------------------.
|
/*-------------------------------------------------------------------.
|
||||||
@@ -1900,8 +1934,6 @@ reader (void)
|
|||||||
nvars = 0;
|
nvars = 0;
|
||||||
nrules = 0;
|
nrules = 0;
|
||||||
nitems = 0;
|
nitems = 0;
|
||||||
rline_allocated = 10;
|
|
||||||
rline = XCALLOC (short, rline_allocated);
|
|
||||||
|
|
||||||
typed = 0;
|
typed = 0;
|
||||||
lastprec = 0;
|
lastprec = 0;
|
||||||
@@ -1929,7 +1961,6 @@ reader (void)
|
|||||||
/* Read the declaration section. Copy %{ ... %} groups to
|
/* Read the declaration section. Copy %{ ... %} groups to
|
||||||
TABLE_OBSTACK and FDEFINES file. Also notice any %token, %left,
|
TABLE_OBSTACK and FDEFINES file. Also notice any %token, %left,
|
||||||
etc. found there. */
|
etc. found there. */
|
||||||
obstack_1grow (&table_obstack, '\n');
|
|
||||||
obstack_fgrow3 (&table_obstack, "\
|
obstack_fgrow3 (&table_obstack, "\
|
||||||
/* %s, made from %s\n\
|
/* %s, made from %s\n\
|
||||||
by GNU bison %s. */\n\
|
by GNU bison %s. */\n\
|
||||||
@@ -1958,6 +1989,8 @@ reader (void)
|
|||||||
packsymbols ();
|
packsymbols ();
|
||||||
/* Convert the grammar into the format described in gram.h. */
|
/* Convert the grammar into the format described in gram.h. */
|
||||||
packgram ();
|
packgram ();
|
||||||
|
/* Output the headers. */
|
||||||
|
symbols_output ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+245
-233
@@ -1,5 +1,5 @@
|
|||||||
/* Grammar reduction for Bison.
|
/* Grammar reduction for Bison.
|
||||||
Copyright 1988, 1989, 2000 Free Software Foundation, Inc.
|
Copyright 1988, 1989, 2000, 2001 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of Bison, the GNU Compiler Compiler.
|
This file is part of Bison, the GNU Compiler Compiler.
|
||||||
|
|
||||||
@@ -38,16 +38,23 @@ typedef unsigned *BSet;
|
|||||||
typedef short *rule;
|
typedef short *rule;
|
||||||
|
|
||||||
|
|
||||||
/* N is set of all nonterminals which are not useless. P is set of
|
/* Set of all nonterminals which are not useless. */
|
||||||
all rules which have no useless nonterminals in their RHS. V is
|
static BSet N;
|
||||||
the set of all accessible symbols. */
|
|
||||||
|
|
||||||
static BSet N, P, V, V1;
|
/* Set of all rules which have no useless nonterminals in their RHS. */
|
||||||
|
static BSet P;
|
||||||
|
|
||||||
|
/* Set of all accessible symbols. */
|
||||||
|
static BSet V;
|
||||||
|
|
||||||
|
/* Set of symbols used to define rule precedence (so they are
|
||||||
|
`useless', but no warning should be issued). */
|
||||||
|
static BSet V1;
|
||||||
|
|
||||||
static int nuseful_productions;
|
static int nuseful_productions;
|
||||||
static int nuseless_productions;
|
static int nuseless_productions;
|
||||||
static int nuseful_nonterminals;
|
static int nuseful_nonterminals;
|
||||||
static int nuseless_nonterminals;
|
int nuseless_nonterminals;
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
bits_equal (BSet L, BSet R, int n)
|
bits_equal (BSet L, BSet R, int n)
|
||||||
@@ -100,7 +107,7 @@ useful_production (int i, BSet N0)
|
|||||||
/* A production is useful if all of the nonterminals in its appear
|
/* A production is useful if all of the nonterminals in its appear
|
||||||
in the set of useful nonterminals. */
|
in the set of useful nonterminals. */
|
||||||
|
|
||||||
for (r = &ritem[rrhs[i]]; *r > 0; r++)
|
for (r = &ritem[rule_table[i].rhs]; *r > 0; r++)
|
||||||
if (ISVAR (n = *r))
|
if (ISVAR (n = *r))
|
||||||
if (!BITISSET (N0, n - ntokens))
|
if (!BITISSET (N0, n - ntokens))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@@ -149,7 +156,7 @@ useless_nonterminals (void)
|
|||||||
{
|
{
|
||||||
if (useful_production (i, N))
|
if (useful_production (i, N))
|
||||||
{
|
{
|
||||||
SETBIT (Np, rlhs[i] - ntokens);
|
SETBIT (Np, rule_table[i].lhs - ntokens);
|
||||||
SETBIT (P, i);
|
SETBIT (P, i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -200,38 +207,33 @@ inaccessable_symbols (void)
|
|||||||
Pp = XCALLOC (unsigned, WORDSIZE (nrules + 1));
|
Pp = XCALLOC (unsigned, WORDSIZE (nrules + 1));
|
||||||
|
|
||||||
/* If the start symbol isn't useful, then nothing will be useful. */
|
/* If the start symbol isn't useful, then nothing will be useful. */
|
||||||
if (!BITISSET (N, start_symbol - ntokens))
|
if (BITISSET (N, start_symbol - ntokens))
|
||||||
goto end_iteration;
|
|
||||||
|
|
||||||
SETBIT (V, start_symbol);
|
|
||||||
|
|
||||||
while (1)
|
|
||||||
{
|
{
|
||||||
for (i = WORDSIZE (nsyms) - 1; i >= 0; i--)
|
SETBIT (V, start_symbol);
|
||||||
Vp[i] = V[i];
|
|
||||||
for (i = 1; i <= nrules; i++)
|
while (1)
|
||||||
{
|
{
|
||||||
if (!BITISSET (Pp, i) && BITISSET (P, i) && BITISSET (V, rlhs[i]))
|
for (i = WORDSIZE (nsyms) - 1; i >= 0; i--)
|
||||||
|
Vp[i] = V[i];
|
||||||
|
for (i = 1; i <= nrules; i++)
|
||||||
{
|
{
|
||||||
for (r = &ritem[rrhs[i]]; *r >= 0; r++)
|
if (!BITISSET (Pp, i)
|
||||||
|
&& BITISSET (P, i)
|
||||||
|
&& BITISSET (V, rule_table[i].lhs))
|
||||||
{
|
{
|
||||||
if (ISTOKEN (t = *r) || BITISSET (N, t - ntokens))
|
for (r = &ritem[rule_table[i].rhs]; *r >= 0; r++)
|
||||||
{
|
if (ISTOKEN (t = *r) || BITISSET (N, t - ntokens))
|
||||||
SETBIT (Vp, t);
|
SETBIT (Vp, t);
|
||||||
}
|
SETBIT (Pp, i);
|
||||||
}
|
}
|
||||||
SETBIT (Pp, i);
|
|
||||||
}
|
}
|
||||||
|
if (bits_equal (V, Vp, WORDSIZE (nsyms)))
|
||||||
|
break;
|
||||||
|
Vs = Vp;
|
||||||
|
Vp = V;
|
||||||
|
V = Vs;
|
||||||
}
|
}
|
||||||
if (bits_equal (V, Vp, WORDSIZE (nsyms)))
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
Vs = Vp;
|
|
||||||
Vp = V;
|
|
||||||
V = Vs;
|
|
||||||
}
|
}
|
||||||
end_iteration:
|
|
||||||
|
|
||||||
XFREE (V);
|
XFREE (V);
|
||||||
V = Vp;
|
V = Vp;
|
||||||
@@ -255,39 +257,46 @@ end_iteration:
|
|||||||
|
|
||||||
/* A token that was used in %prec should not be warned about. */
|
/* A token that was used in %prec should not be warned about. */
|
||||||
for (i = 1; i < nrules; i++)
|
for (i = 1; i < nrules; i++)
|
||||||
if (rprecsym[i] != 0)
|
if (rule_table[i].precsym != 0)
|
||||||
SETBIT (V1, rprecsym[i]);
|
SETBIT (V1, rule_table[i].precsym);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
reduce_grammar_tables (void)
|
reduce_grammar_tables (void)
|
||||||
{
|
{
|
||||||
/* This is turned off because we would need to change the numbers
|
/* This is turned off because we would need to change the numbers in
|
||||||
in the case statements in the actions file. */
|
the case statements in the actions file.
|
||||||
#if 0
|
|
||||||
/* remove useless productions */
|
|
||||||
if (nuseless_productions > 0)
|
|
||||||
{
|
|
||||||
short np, pn, ni, pi;
|
|
||||||
|
|
||||||
np = 0;
|
We don't disable it via CPP so that it is still checked with the
|
||||||
ni = 0;
|
rest of the code, to avoid its becoming completely obsolete.
|
||||||
for (pn = 1; pn <= nrules; pn++)
|
|
||||||
{
|
FIXME: I think the comment above demonstrates this code must be
|
||||||
|
turned off for *semantic* parser, not in the general case. Try
|
||||||
|
to understand this better --akim. */
|
||||||
|
|
||||||
|
if (0)
|
||||||
|
/* remove useless productions */
|
||||||
|
if (nuseless_productions > 0)
|
||||||
|
{
|
||||||
|
short np, pn, ni, pi;
|
||||||
|
|
||||||
|
np = 0;
|
||||||
|
ni = 0;
|
||||||
|
for (pn = 1; pn <= nrules; pn++)
|
||||||
if (BITISSET (P, pn))
|
if (BITISSET (P, pn))
|
||||||
{
|
{
|
||||||
np++;
|
np++;
|
||||||
if (pn != np)
|
if (pn != np)
|
||||||
{
|
{
|
||||||
rlhs[np] = rlhs[pn];
|
rule_table[np].lhs = rule_table[pn].lhs;
|
||||||
rline[np] = rline[pn];
|
rule_table[np].line = rule_table[pn].line;
|
||||||
rprec[np] = rprec[pn];
|
rule_table[np].prec = rule_table[pn].prec;
|
||||||
rassoc[np] = rassoc[pn];
|
rule_table[np].assoc = rule_table[pn].assoc;
|
||||||
rrhs[np] = rrhs[pn];
|
rule_table[np].rhs = rule_table[pn].rhs;
|
||||||
if (rrhs[np] != ni)
|
if (rule_table[np].rhs != ni)
|
||||||
{
|
{
|
||||||
pi = rrhs[np];
|
pi = rule_table[np].rhs;
|
||||||
rrhs[np] = ni;
|
rule_table[np].rhs = ni;
|
||||||
while (ritem[pi] >= 0)
|
while (ritem[pi] >= 0)
|
||||||
ritem[ni++] = ritem[pi++];
|
ritem[ni++] = ritem[pi++];
|
||||||
ritem[ni++] = -np;
|
ritem[ni++] = -np;
|
||||||
@@ -298,214 +307,220 @@ reduce_grammar_tables (void)
|
|||||||
while (ritem[ni++] >= 0);
|
while (ritem[ni++] >= 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
ritem[ni] = 0;
|
|
||||||
nrules -= nuseless_productions;
|
|
||||||
nitems = ni;
|
|
||||||
|
|
||||||
/* Is it worth it to reduce the amount of memory for the
|
ritem[ni] = 0;
|
||||||
grammar? Probably not. */
|
nrules -= nuseless_productions;
|
||||||
|
nitems = ni;
|
||||||
|
|
||||||
}
|
/* Is it worth it to reduce the amount of memory for the
|
||||||
#endif /* 0 */
|
grammar? Probably not. */
|
||||||
/* Disable useless productions,
|
}
|
||||||
since they may contain useless nonterms
|
|
||||||
that would get mapped below to -1 and confuse everyone. */
|
/* Disable useless productions. */
|
||||||
if (nuseless_productions > 0)
|
if (nuseless_productions > 0)
|
||||||
{
|
{
|
||||||
int pn;
|
int pn;
|
||||||
|
|
||||||
for (pn = 1; pn <= nrules; pn++)
|
for (pn = 1; pn <= nrules; pn++)
|
||||||
{
|
rule_table[pn].useful = BITISSET (P, pn);
|
||||||
if (!BITISSET (P, pn))
|
|
||||||
{
|
|
||||||
rlhs[pn] = -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* remove useless symbols */
|
|
||||||
if (nuseless_nonterminals > 0)
|
|
||||||
{
|
|
||||||
|
|
||||||
int i, n;
|
|
||||||
/* short j; JF unused */
|
|
||||||
short *nontermmap;
|
|
||||||
rule r;
|
|
||||||
|
|
||||||
/* Create a map of nonterminal number to new nonterminal
|
|
||||||
number. -1 in the map means it was useless and is being
|
|
||||||
eliminated. */
|
|
||||||
|
|
||||||
nontermmap = XCALLOC (short, nvars) - ntokens;
|
|
||||||
for (i = ntokens; i < nsyms; i++)
|
|
||||||
nontermmap[i] = -1;
|
|
||||||
|
|
||||||
n = ntokens;
|
|
||||||
for (i = ntokens; i < nsyms; i++)
|
|
||||||
if (BITISSET (V, i))
|
|
||||||
nontermmap[i] = n++;
|
|
||||||
|
|
||||||
/* Shuffle elements of tables indexed by symbol number. */
|
|
||||||
|
|
||||||
for (i = ntokens; i < nsyms; i++)
|
|
||||||
{
|
|
||||||
n = nontermmap[i];
|
|
||||||
if (n >= 0)
|
|
||||||
{
|
|
||||||
sassoc[n] = sassoc[i];
|
|
||||||
sprec[n] = sprec[i];
|
|
||||||
tags[n] = tags[i];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
free (tags[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Replace all symbol numbers in valid data structures. */
|
|
||||||
|
|
||||||
for (i = 1; i <= nrules; i++)
|
|
||||||
{
|
|
||||||
/* Ignore the rules disabled above. */
|
|
||||||
if (rlhs[i] >= 0)
|
|
||||||
rlhs[i] = nontermmap[rlhs[i]];
|
|
||||||
if (ISVAR (rprecsym[i]))
|
|
||||||
/* Can this happen? */
|
|
||||||
rprecsym[i] = nontermmap[rprecsym[i]];
|
|
||||||
}
|
|
||||||
|
|
||||||
for (r = ritem; *r; r++)
|
|
||||||
if (ISVAR (*r))
|
|
||||||
*r = nontermmap[*r];
|
|
||||||
|
|
||||||
start_symbol = nontermmap[start_symbol];
|
|
||||||
|
|
||||||
nsyms -= nuseless_nonterminals;
|
|
||||||
nvars -= nuseless_nonterminals;
|
|
||||||
|
|
||||||
free (&nontermmap[ntokens]);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
print_results (void)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
/* short j; JF unused */
|
|
||||||
rule r;
|
|
||||||
bool b;
|
|
||||||
|
|
||||||
|
/*------------------------------.
|
||||||
|
| Remove useless nonterminals. |
|
||||||
|
`------------------------------*/
|
||||||
|
|
||||||
|
static void
|
||||||
|
nonterminals_reduce (void)
|
||||||
|
{
|
||||||
|
int i, n;
|
||||||
|
rule r;
|
||||||
|
|
||||||
|
/* Map the nonterminals to their new index: useful first, useless
|
||||||
|
afterwards. Kept for later report. */
|
||||||
|
|
||||||
|
short *nontermmap = XCALLOC (short, nvars) - ntokens;
|
||||||
|
n = ntokens;
|
||||||
|
for (i = ntokens; i < nsyms; i++)
|
||||||
|
if (BITISSET (V, i))
|
||||||
|
nontermmap[i] = n++;
|
||||||
|
for (i = ntokens; i < nsyms; i++)
|
||||||
|
if (!BITISSET (V, i))
|
||||||
|
nontermmap[i] = n++;
|
||||||
|
|
||||||
|
|
||||||
|
/* Shuffle elements of tables indexed by symbol number. */
|
||||||
|
{
|
||||||
|
short *sassoc_sorted = XMALLOC (short, nvars) - ntokens;
|
||||||
|
short *sprec_sorted = XMALLOC (short, nvars) - ntokens;
|
||||||
|
char **tags_sorted = XMALLOC (char *, nvars) - ntokens;
|
||||||
|
|
||||||
|
for (i = ntokens; i < nsyms; i++)
|
||||||
|
{
|
||||||
|
n = nontermmap[i];
|
||||||
|
sassoc_sorted[n] = sassoc[i];
|
||||||
|
sprec_sorted[n] = sprec[i];
|
||||||
|
tags_sorted[n] = tags[i];
|
||||||
|
}
|
||||||
|
for (i = ntokens; i < nsyms; i++)
|
||||||
|
{
|
||||||
|
sassoc[i] = sassoc_sorted[i];
|
||||||
|
sprec[i] = sprec_sorted[i];
|
||||||
|
tags[i] = tags_sorted[i];
|
||||||
|
}
|
||||||
|
free (sassoc_sorted + ntokens);
|
||||||
|
free (sprec_sorted + ntokens);
|
||||||
|
free (tags_sorted + ntokens);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Replace all symbol numbers in valid data structures. */
|
||||||
|
|
||||||
|
for (i = 1; i <= nrules; i++)
|
||||||
|
{
|
||||||
|
rule_table[i].lhs = nontermmap[rule_table[i].lhs];
|
||||||
|
if (ISVAR (rule_table[i].precsym))
|
||||||
|
/* Can this happen? */
|
||||||
|
rule_table[i].precsym = nontermmap[rule_table[i].precsym];
|
||||||
|
}
|
||||||
|
|
||||||
|
for (r = ritem; *r; r++)
|
||||||
|
if (ISVAR (*r))
|
||||||
|
*r = nontermmap[*r];
|
||||||
|
|
||||||
|
start_symbol = nontermmap[start_symbol];
|
||||||
|
|
||||||
|
nsyms -= nuseless_nonterminals;
|
||||||
|
nvars -= nuseless_nonterminals;
|
||||||
|
|
||||||
|
free (nontermmap + ntokens);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------.
|
||||||
|
| Output the detailed results of the reductions. For FILE.output. |
|
||||||
|
`------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void
|
||||||
|
reduce_output (FILE *out)
|
||||||
|
{
|
||||||
if (nuseless_nonterminals > 0)
|
if (nuseless_nonterminals > 0)
|
||||||
{
|
{
|
||||||
obstack_sgrow (&output_obstack, _("Useless nonterminals:"));
|
int i;
|
||||||
obstack_sgrow (&output_obstack, "\n\n");
|
fprintf (out, "%s\n\n", _("Useless nonterminals:"));
|
||||||
for (i = ntokens; i < nsyms; i++)
|
for (i = 0; i < nuseless_nonterminals; ++i)
|
||||||
if (!BITISSET (V, i))
|
fprintf (out, " %s\n", tags[nsyms + i]);
|
||||||
obstack_fgrow1 (&output_obstack, " %s\n", tags[i]);
|
fputs ("\n\n", out);
|
||||||
}
|
}
|
||||||
b = FALSE;
|
|
||||||
for (i = 0; i < ntokens; i++)
|
{
|
||||||
{
|
bool b = FALSE;
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < ntokens; i++)
|
||||||
if (!BITISSET (V, i) && !BITISSET (V1, i))
|
if (!BITISSET (V, i) && !BITISSET (V1, i))
|
||||||
{
|
{
|
||||||
if (!b)
|
if (!b)
|
||||||
{
|
fprintf (out, "%s\n\n", _("Terminals which are not used:"));
|
||||||
obstack_sgrow (&output_obstack, "\n\n");
|
b = TRUE;
|
||||||
obstack_sgrow (&output_obstack,
|
fprintf (out, " %s\n", tags[i]);
|
||||||
_("Terminals which are not used:"));
|
|
||||||
obstack_sgrow (&output_obstack, "\n\n");
|
|
||||||
b = TRUE;
|
|
||||||
}
|
|
||||||
obstack_fgrow1 (&output_obstack, " %s\n", tags[i]);
|
|
||||||
}
|
}
|
||||||
}
|
if (b)
|
||||||
|
fputs ("\n\n", out);
|
||||||
|
}
|
||||||
|
|
||||||
if (nuseless_productions > 0)
|
if (nuseless_productions > 0)
|
||||||
{
|
{
|
||||||
obstack_sgrow (&output_obstack, "\n\n");
|
int i;
|
||||||
obstack_sgrow (&output_obstack, _("Useless rules:"));
|
fprintf (out, "%s\n\n", _("Useless rules:"));
|
||||||
obstack_sgrow (&output_obstack, "\n\n");
|
|
||||||
for (i = 1; i <= nrules; i++)
|
for (i = 1; i <= nrules; i++)
|
||||||
{
|
if (!rule_table[i].useful)
|
||||||
if (!BITISSET (P, i))
|
{
|
||||||
{
|
rule r;
|
||||||
obstack_fgrow1 (&output_obstack, "#%-4d ", i);
|
fprintf (out, "#%-4d ", i);
|
||||||
obstack_fgrow1 (&output_obstack, "%s :\t", tags[rlhs[i]]);
|
fprintf (out, "%s:", tags[rule_table[i].lhs]);
|
||||||
for (r = &ritem[rrhs[i]]; *r >= 0; r++)
|
for (r = &ritem[rule_table[i].rhs]; *r >= 0; r++)
|
||||||
obstack_fgrow1 (&output_obstack, " %s", tags[*r]);
|
fprintf (out, " %s", tags[*r]);
|
||||||
obstack_sgrow (&output_obstack, ";\n");
|
fputs (";\n", out);
|
||||||
}
|
}
|
||||||
}
|
fputs ("\n\n", out);
|
||||||
}
|
}
|
||||||
if (nuseless_nonterminals > 0 || nuseless_productions > 0 || b)
|
|
||||||
obstack_sgrow (&output_obstack, "\n\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0 /* XXX currently unused. */
|
|
||||||
static void
|
static void
|
||||||
dump_grammar (void)
|
dump_grammar (FILE *out)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
rule r;
|
rule r;
|
||||||
|
|
||||||
obstack_fgrow5 (&output_obstack,
|
fprintf (out, "REDUCED GRAMMAR\n\n");
|
||||||
"ntokens = %d, nvars = %d, nsyms = %d, nrules = %d, nitems = %d\n\n",
|
fprintf (out,
|
||||||
ntokens, nvars, nsyms, nrules, nitems);
|
"ntokens = %d, nvars = %d, nsyms = %d, nrules = %d, nitems = %d\n\n",
|
||||||
obstack_sgrow (&output_obstack,
|
ntokens, nvars, nsyms, nrules, nitems);
|
||||||
_("Variables\n---------\n\n"));
|
fprintf (out, "Variables\n---------\n\n");
|
||||||
obstack_sgrow (&output_obstack,
|
fprintf (out, "Value Sprec Sassoc Tag\n");
|
||||||
_("Value Sprec Sassoc Tag\n"));
|
|
||||||
for (i = ntokens; i < nsyms; i++)
|
for (i = ntokens; i < nsyms; i++)
|
||||||
obstack_fgrow4 (&output_obstack,
|
fprintf (out, "%5d %5d %5d %s\n", i, sprec[i], sassoc[i], tags[i]);
|
||||||
"%5d %5d %5d %s\n", i, sprec[i], sassoc[i], tags[i]);
|
fprintf (out, "\n\n");
|
||||||
obstack_sgrow (&output_obstack, "\n\n");
|
fprintf (out, "Rules\n-----\n\n");
|
||||||
obstack_sgrow (&output_obstack, _("Rules\n-----\n\n"));
|
fprintf (out, "Num (Prec, Assoc, Useful, Ritem Range) Lhs -> Rhs (Ritem range) [Num]\n");
|
||||||
for (i = 1; i <= nrules; i++)
|
for (i = 1; i <= nrules; i++)
|
||||||
{
|
{
|
||||||
obstack_fgrow5 (&output_obstack, "%-5d(%5d%5d)%5d : (@%-5d)",
|
int rhs_count = 0;
|
||||||
i, rprec[i], rassoc[i], rlhs[i], rrhs[i]);
|
/* Find the last RHS index in ritems. */
|
||||||
for (r = &ritem[rrhs[i]]; *r > 0; r++)
|
for (r = &ritem[rule_table[i].rhs]; *r > 0; ++r)
|
||||||
obstack_fgrow1 (&output_obstack, "%5d", *r);
|
++rhs_count;
|
||||||
obstack_fgrow1 (&output_obstack, " [%d]\n", -(*r));
|
fprintf (out, "%3d (%2d, %2d, %2d, %2d-%2d) %2d ->",
|
||||||
|
i,
|
||||||
|
rule_table[i].prec, rule_table[i].assoc, rule_table[i].useful,
|
||||||
|
rule_table[i].rhs, rule_table[i].rhs + rhs_count - 1,
|
||||||
|
rule_table[i].lhs);
|
||||||
|
/* Dumped the RHS. */
|
||||||
|
for (r = &ritem[rule_table[i].rhs]; *r > 0; r++)
|
||||||
|
fprintf (out, "%3d", *r);
|
||||||
|
fprintf (out, " [%d]\n", -(*r));
|
||||||
}
|
}
|
||||||
obstack_sgrow (&output_obstack, "\n\n");
|
fprintf (out, "\n\n");
|
||||||
obstack_sgrow (&output_obstack,
|
fprintf (out, "Rules interpreted\n-----------------\n\n");
|
||||||
_("Rules interpreted\n-----------------\n\n"));
|
|
||||||
for (i = 1; i <= nrules; i++)
|
for (i = 1; i <= nrules; i++)
|
||||||
{
|
{
|
||||||
obstack_fgrow2 (&output_obstack, "%-5d %s :", i, tags[rlhs[i]]);
|
fprintf (out, "%-5d %s :", i, tags[rule_table[i].lhs]);
|
||||||
for (r = &ritem[rrhs[i]]; *r > 0; r++)
|
for (r = &ritem[rule_table[i].rhs]; *r > 0; r++)
|
||||||
obstack_fgrow1 (&output_obstack, " %s", tags[*r]);
|
fprintf (out, " %s", tags[*r]);
|
||||||
obstack_grow1 (&output_obstack, '\n');
|
fputc ('\n', out);
|
||||||
}
|
}
|
||||||
obstack_sgrow (&output_obstack, "\n\n");
|
fprintf (out, "\n\n");
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*-------------------------------.
|
||||||
|
| Report the results to STDERR. |
|
||||||
|
`-------------------------------*/
|
||||||
|
|
||||||
static void
|
static void
|
||||||
print_notices (void)
|
reduce_print (void)
|
||||||
{
|
{
|
||||||
if (yacc_flag && nuseless_productions)
|
if (yacc_flag && nuseless_productions)
|
||||||
fprintf (stderr, _("%d rules never reduced\n"), nuseless_productions);
|
fprintf (stderr, ngettext ("%d rule never reduced\n",
|
||||||
|
"%d rules never reduced\n",
|
||||||
|
nuseless_productions),
|
||||||
|
nuseless_productions);
|
||||||
|
|
||||||
fprintf (stderr, _("%s contains "), infile);
|
fprintf (stderr, _("%s contains "), infile);
|
||||||
|
|
||||||
if (nuseless_nonterminals > 0)
|
if (nuseless_nonterminals > 0)
|
||||||
{
|
fprintf (stderr, ngettext ("%d useless nonterminal",
|
||||||
fprintf (stderr, _("%d useless nonterminal%s"),
|
"%d useless nonterminals",
|
||||||
nuseless_nonterminals,
|
nuseless_nonterminals),
|
||||||
(nuseless_nonterminals == 1 ? "" : "s"));
|
nuseless_nonterminals);
|
||||||
}
|
|
||||||
if (nuseless_nonterminals > 0 && nuseless_productions > 0)
|
if (nuseless_nonterminals > 0 && nuseless_productions > 0)
|
||||||
fprintf (stderr, _(" and "));
|
fprintf (stderr, _(" and "));
|
||||||
|
|
||||||
if (nuseless_productions > 0)
|
if (nuseless_productions > 0)
|
||||||
{
|
fprintf (stderr, ngettext ("%d useless rule",
|
||||||
fprintf (stderr, _("%d useless rule%s"),
|
"%d useless rules",
|
||||||
nuseless_productions, (nuseless_productions == 1 ? "" : "s"));
|
nuseless_productions),
|
||||||
}
|
nuseless_productions);
|
||||||
fprintf (stderr, "\n");
|
fprintf (stderr, "\n");
|
||||||
fflush (stderr);
|
fflush (stderr);
|
||||||
}
|
}
|
||||||
@@ -527,42 +542,39 @@ reduce_grammar (void)
|
|||||||
|
|
||||||
reduced = (bool) (nuseless_nonterminals + nuseless_productions > 0);
|
reduced = (bool) (nuseless_nonterminals + nuseless_productions > 0);
|
||||||
|
|
||||||
if (verbose_flag)
|
if (!reduced)
|
||||||
print_results ();
|
return;
|
||||||
|
|
||||||
if (reduced == FALSE)
|
reduce_print ();
|
||||||
goto done_reducing;
|
|
||||||
|
|
||||||
print_notices ();
|
|
||||||
|
|
||||||
if (!BITISSET (N, start_symbol - ntokens))
|
if (!BITISSET (N, start_symbol - ntokens))
|
||||||
fatal (_("Start symbol %s does not derive any sentence"),
|
fatal (_("Start symbol %s does not derive any sentence"),
|
||||||
tags[start_symbol]);
|
tags[start_symbol]);
|
||||||
|
|
||||||
reduce_grammar_tables ();
|
reduce_grammar_tables ();
|
||||||
#if 0
|
if (nuseless_nonterminals > 0)
|
||||||
if (verbose_flag)
|
nonterminals_reduce ();
|
||||||
|
|
||||||
|
if (trace_flag)
|
||||||
{
|
{
|
||||||
obstack_fgrow1 (&output_obstack, "REDUCED GRAMMAR\n\n");
|
dump_grammar (stderr);
|
||||||
dump_grammar ();
|
|
||||||
|
fprintf (stderr, "reduced %s defines %d terminals, %d nonterminals\
|
||||||
|
, and %d productions.\n",
|
||||||
|
infile, ntokens, nvars, nrules);
|
||||||
}
|
}
|
||||||
#endif
|
}
|
||||||
|
|
||||||
if (statistics_flag)
|
|
||||||
fprintf (stderr, _("reduced %s defines %d terminal%s, %d nonterminal%s\
|
|
||||||
, and %d production%s.\n"),
|
|
||||||
infile,
|
|
||||||
ntokens,
|
|
||||||
(ntokens == 1 ? "" : "s"),
|
|
||||||
nvars,
|
|
||||||
(nvars == 1 ? "" : "s"),
|
|
||||||
nrules,
|
|
||||||
(nrules == 1 ? "" : "s"));
|
|
||||||
|
|
||||||
done_reducing:
|
/*-----------------------------------------------------------.
|
||||||
/* Free the global sets used to compute the reduced grammar */
|
| Free the global sets used to compute the reduced grammar. |
|
||||||
|
`-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
void
|
||||||
|
reduce_free (void)
|
||||||
|
{
|
||||||
XFREE (N);
|
XFREE (N);
|
||||||
XFREE (V);
|
XFREE (V);
|
||||||
|
XFREE (V1);
|
||||||
XFREE (P);
|
XFREE (P);
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-1
@@ -1,5 +1,5 @@
|
|||||||
/* Grammar reduction for Bison.
|
/* Grammar reduction for Bison.
|
||||||
Copyright 2000 Free Software Foundation, Inc.
|
Copyright 2000, 2001 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of Bison, the GNU Compiler Compiler.
|
This file is part of Bison, the GNU Compiler Compiler.
|
||||||
|
|
||||||
@@ -22,5 +22,8 @@
|
|||||||
# define REDUCE_H_
|
# define REDUCE_H_
|
||||||
|
|
||||||
void reduce_grammar PARAMS ((void));
|
void reduce_grammar PARAMS ((void));
|
||||||
|
void reduce_output PARAMS ((FILE *out));
|
||||||
|
void reduce_free PARAMS ((void));
|
||||||
|
|
||||||
|
extern int nuseless_nonterminals;
|
||||||
#endif /* !REDUCE_H_ */
|
#endif /* !REDUCE_H_ */
|
||||||
|
|||||||
+35
@@ -0,0 +1,35 @@
|
|||||||
|
/* Type definitions for nondeterministic finite state machine for bison,
|
||||||
|
Copyright 2001 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
This file is part of Bison, the GNU Compiler Compiler.
|
||||||
|
|
||||||
|
Bison 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.
|
||||||
|
|
||||||
|
Bison 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 Bison; see the file COPYING. If not, write to
|
||||||
|
the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
|
||||||
|
#include "system.h"
|
||||||
|
#include "state.h"
|
||||||
|
|
||||||
|
/*---------------------------------.
|
||||||
|
| Create a new array of N shitfs. |
|
||||||
|
`---------------------------------*/
|
||||||
|
|
||||||
|
shifts *
|
||||||
|
shifts_new (int n)
|
||||||
|
{
|
||||||
|
shifts *res = SHIFTS_ALLOC (n);
|
||||||
|
res->nshifts = n;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user