%printer imply %locations.
* src/scan-code.l (SC_SYMBOL_ACTION): Set locations_flag = true when
scanning @$.
* tests/actions.at (AT_CHECK_ACTION_LOCATIONS): New macro supporting...
(@$ in %initial-action implies %locations,
@$ in %destructor implies %locations,
@$ in %printer implies %locations): ... these new test cases.
now that gnulib strcase has been fixed.
* bootstrap.conf (gnulib_modules): Remove c-strcase. Add strcase.
* lib/.cvsignore: Remove c-ctype.c, c-ctype.h, c-strcase.h,
c-strcasecomp.c, c-strncasecmp.c. Add strcasecmp.c, strncasecmp.c
* m4/.cvsignore: Add strcase.m4.
* src/getargs.c: Revert 2007-02-03 change, as follows.
Don't include c-strcase.h.
(language_argmatch): Use strcasecmp rather than c_strcasecmp.
strcasecmp has "unspecified behavior" outside the POSIX locale,
but it works fine in practice if at least one argument is ASCII,
as is the case in Bison.
* data/lalr1.java (Stack): Work around old verifiers that disallow
access to the private fields of an inner class, from the outer class.
We can make Stack's fields public because user code doesn't have access
to the instance of Stack used by parse().
the right spot for these files?
* bootstrap.conf (gnulib_modules): Add c-strcase.
* lib/.cvsignore: Add c-ctype.c c-ctype.h, c-strcasecomp.c,
c-strncasecmp.c.
* src/getargs.c: Include c-strcase.h.
(language_argmatch): Use c_strcasecmp rather than strcasecmp,
to avoid unspecified behavior.
* data/bison.m4 (b4_percent_define_flag_if): Don't treat 0 as false.
Complain if the value does not match empty, "true" or "false".
* data/c++.m4: Adjust default definitions of %define variables.
* data/java.m4: Adjust default definitions of %define variables.
* doc/bison.texinfo (Decl Summary): Adjust the %define entry according
to above behavior.
* tests/input.at (Boolean %define variables): Test new behavior.
* NEWS: Mention java.
* TODO: Remove things that are done.
* bootstrap.conf: Add javacomp-script and javaexec-script.
* configure.ac: Invoke gt_JAVACOMP and gt_JAVAEXEC.
* data/Makefile.am: Add new files.
* data/java-skel.m4: New.
* data/java.m4: New.
* data/lalr1.java: New.
* doc/bison.texinfo: Put "A Complete C++ Example" under
C++ Parsers. Add Java Parsers. Put C++ Parsers and Java Parsers
under Other Languages.
* src/getargs.c (valid_languages): Add Java.
* src/getargs.h (struct bison_language): Update size of string fields.
* tests/Makefile.am: Add java.at.
* tests/atlocal.in: Add CONF_JAVA and CONF_JAVAC.
* tests/java.at: New.
* tests/testsuite.at: Include it.
* src/scan-skel.l (at_directive_perform): Add at_directive_argc and
at_directive_argv arguments so these no longer have to be global
variables. Also, update the implementation for the following changes.
(fail_for_at_directive_too_many_args,
fail_for_at_directive_too_few_args): Add at_directive_name argument.
(at_directive_name): Remove as at_directive_argv[0] will be used for
this now.
(AT_DIRECTIVE_ARGC_MAX): Increment to make space in at_directive_argv
for the directive name.
(at_directive_argc, at_directive_argv): Make these local within
skel_lex instead of global.
(INITIAL): Update directive start action for above changes.
(SC_AT_DIRECTIVE_ARG): Rename to...
(SC_AT_DIRECTIVE_ARGS): ... this, and update for above changes.
(SC_AT_DIRECTIVE_SKIP_WS): Update.
(scan_skel): Move yylex_destroy to...
(skel_scanner_free): ... here.
* tests/skeletons.at (installed skeleton file name): Rename to...
(installed skeleton file names): ... this.
node names: say "Table of Symbols" not "Bison Symbols", and say "Decl
Summary" not "Directives".
* doc/bison.texinfo (Decl Summary, Calc++ Parser): Cross-reference the
%code entry in "Decl Summary" rather than the one in "Table of Symbols"
since the former is now the more complete one.
(Prologue Alternatives): Likewise and do the same for %defines.
(Table of Symbols): Add summary of %code, add summary of %define, and
move full %code documentation to...
(Decl Summary): ... here for consistency with other entries in these
sections.
Move %define entry in order to keep this list alphabetized.
Reword %define entry a little to put less emphasis on the skeleton
concept, which most users shouldn't have to think about.
can be used anywhere including inside arguments of directives of the
form @foo(...@). Eventually, it should be possible to write an
xgettext-like utility to extract @gettext<...@> text from skeletons.
* data/bison.m4 (b4_check_user_names): Use @gettext<...@> when invoking
b4_warn_at since b4_warn_at doesn't invoke gettext anymore.
* data/glr.cc, data/lalr1.cc: Likewise but for b4_fatal and
b4_complain reporting a push-parsing request or a missing %defines.
* src/scan-skel.l (INITIAL): Recognize `@gettext<' to start...
(SC_AT_GETTEXT_ARG): ... this new start condition where gettext is
invoked.
(SC_AT_DIRECTIVE_ARG): Rename to...
(SC_AT_DIRECTIVE_ARGS): ... this, and recognize `@gettext<' to start
SC_AT_GETTEXT_ARG.
(at_directive_perform): Don't invoke gettext for @warn(...@),
@warn_at(...@), etc. Instead, let the skeletons decide what should be
passed to @gettext<...@>.
* tests/skeletons.at (@gettext<...@>): New test case.
* tests/skeletons.at (installed skeleton file name): Rename to...
(installed skeleton file names): ... this.
Discussed starting at
<http://lists.gnu.org/archive/html/bison-patches/2006-12/msg00071.html>.
* doc/bison.texinfo (Decl Summary): Document in %skeleton entry.
(Bison Options): Document in --skeleton entry.
* src/output.c (output_skeleton): Use strncpy rather than strcpy since
full_skeleton can't necessarily hold all of pkgdatadir.
If the specified skeleton file name contains a `/', don't prepend
pkgdatadir.
* src/parse-gram.y (prologue_declaration): If the specified skeleton
file name contains a `/', prepend the grammar file directory.
* tests/Makefile.am (TESTSUITE_AT): Add skeletons.at.
* skeletons.at: New file.
(relative skeleton file names): New test case.
(installed skeleton file names): New test case.
* tests/testsuite.at: Include skeletons.at.
* bootstrap: Update copyright to 2007.
error code.
(Calc++ Scanner): Exit with failure if we can't open the input
file.
Accept "-" standing for stdin.
(Calc++ Top Level): Print the result only if the parsing was
successful.
importantly, rename all related macros to be in the b4_percent_define
and b4_percent_code namespaces. Also, complete support for `.' in
%define variable names and %code qualifiers.
* data/bison.m4 (b4_check_user_names): Check for special
"SKELETON-NAMESPACE(name)" macros instead of using two nested
m4_foreach loops.
(b4_get_percent_define, b4_get_percent_code): Rename to...
(b4_percent_define_get, b4_percent_code_get): ... these.
Extend documentation with examples.
For SKELETON-NAMESPACE (as documented for b4_check_user_names), use
b4_percent_define_skeleton_variables and
b4_percent_code_skeleton_qualifiers.
Expect any value for the %define variable `foo' to be stored in the
macro named `b4_percent_define(foo)'; expect any %code blocks for the
qualifier `foo' to be stored in a macro named `b4_percent_code(foo)';
expect any unqualified %code blocks to be stored in a macro named
`b4_percent_code_unqualified'.
Use m4_indir so that %define variable names and %code qualifiers can
contain `.', which is allowed by the grammar parser.
(b4_percent_define_default): New macro to set a default value for a
%define variable.
(m4_wrap): Update wrapped code, and fix some underquoting.
(b4_check_user_names_wrap): Update and define outside the m4_wrap.
Expect grammar uses of %define variables and %code qualifiers to be
defined in b4_percent_define_user_variables and
b4_percent_code_user_qualifiers.
* data/c++.m4: Use b4_percent_define_default rather than
m4_define_default. Fix some underquoting. Skeleton usage of %define
variable define_location_comparison now implies skeleton usage of
%define variable filename_type.
* data/glr.c, data/glr.cc, data/lalr1.cc, data/location.cc,
data/push.c, data/yacc.c: Update macro names.
* src/parse-gram.y (prologue_declaration, grammar_declaration): Update
muscle names.
run parsers in all tests so that Valgrind is invoked during
maintainer-check-valgrind.
(Duplicate representation of merged trees): Free all semantic values.
(Duplicated user destructor for lookahead): Likewise.
command-line prefix.
* tests/torture.at (Exploding the Stack Size with Alloca): Stderr is
ignored, so use that PRE to set --log-fd=1 in VALGRIND_OPTS so we don't
miss Valgrind messages.
(Exploding the Stack Size with Malloc): Likewise.
locals. Reported by Juan Manuel Guerrero at
<http://lists.gnu.org/archive/html/bug-bison/2007-01/msg00000.html>.
* data/push.c: Enclose the #ifdef YYSTACK_USE_ALLOCA in b4_push_if.
Fix some indentation also.
* tests/torture.at (Exploding the Stack Size with Alloca): Add comment
explaining this issue.
params with digraphs.
* data/bison.m4 (b4_pre_prologue, b4_post_prologue): Set their default
values to the empty string since these are no longer guaranteed
initialized by the front-end.
* data/glr.c, data/glr.cc, data/lalr1.cc, data/push.c, data/yacc.c: Add
braces around b4_user_stype since this is no longer done by the
front-end.
* src/files.c, src/files.h (pre_prologue_obstack,
post_prologue_obstack): Remove.
* src/muscle_tab.c (muscle_pair_list_grow): Don't duplicate header
comments here. Use MUSCLE_OBSTACK_SGROW so that values are escaped
with digraphs. This fixes lex params and parse params.
* src/muscle_tab.h (muscle_pair_list_grow): Update comments.
* src/output.c (prepare): Remove muscle insertion of the prologues.
(output): Remove freeing of pre_prologue_obstack and
post_prologue_obstack.
* src/parse-gram.y (prologue_declaration): Use muscle_code_grow rather
than prologue_augment for prologue parsing so you don't need prologue
obstacks.
(grammar_declaration): Use `braceless' instead of "{...}" so that
braces are already stripped and code is escaped with digraphs.
* src/reader.c (prologue_augment): Remove.
(reader): Remove initialization of pre_prologue_obstack and
post_prologue_obstack.
* src/reader.h (prologue_augment): Remove.
* data/c.m4: Remove stray parenthesis.
qualifiers in %code directives, and restrict the characters that are
allowed in them to M4-friendly ones. For %define, continue to support
the quoted form as a deprecated feature. Discussed starting at
<http://lists.gnu.org/archive/html/bison-patches/2007-01/msg00023.html>.
* NEWS (2.3a+): Add entry for the change to %define. Update entry for
%code.
* doc/bison.texinfo (Prologue Alternatives): Update.
(Bison Declaration Summary): In %defines entry, update mention of
`%code requires' and `%code provides'.
(C++ Location Values): Update %define uses.
(Calc++ Parser Interface): Likewise.
(Calc++ Parser): Likewise, and update `%code requires' uses.
(Bison Symbols): Update %code documentation.
* src/parse-gram.y (prologue_declaration): For %define variables, use
`variable' instead of `STRING'.
(grammar_declaration): For %code qualifiers, use `ID' instead of
`STRING'.
(variable): New nonterminal that takes an `ID' or a `STRING'.
* tests/actions.at (_AT_CHECK_PRINTER_AND_DESTRUCTOR): Update %code
and %define uses.
* tests/calc.at (_AT_DATA_CALC_Y): Update %define use.
* tests/input.at (Reject unused %code qualifiers): Update %code uses.
(%define errors): Update %define uses.
instead of muscle_insert for %define values so that M4-special
characters are replaced with digraphs.
* tests/input.at (%define errors): Extend to check weird values.
%code qualifiers, provide macros that retrieve the associated values
and build these lists automatically. Thus Bison will now warn when a
variable or qualifier is not used by the skeleton in the current
invocation regardless of whether it might sometimes be used by that
skeleton in other invocations. Also, move all %define value macros to
the b4_percent_define_ namespace, and remove the %define "NAME" {CODE}
form, which is replaced by %code.
* data/bison.m4 (b4_check_for_unrecognized_names): Rename to...
(b4_check_user_names): ... this, and change the series of valid name
arguments to a single list argument for names used in the skeleton
similar to the existing list argument for names used in the grammar.
Warn instead of complaining.
(b4_get_percent_define, b4_get_percent_code): New to retrieve %define
values and %code code, to format %code code properly, and to build
lists of all %define variables and %code qualifiers used in the
skeleton: b4_skeleton_percent_define_variables and
b4_skeleton_percent_code_qualifiers.
(b4_check_percent_define_variables, b4_check_percent_code_qualifiers):
Remove, and...
(m4_wrap): ... m4_wrap b4_check_user_names invocations instead so that
the skeleton names lists can finish building first. In place of
b4_used_percent_define_variables and b4_used_percent_code_qualifiers,
expect the lists b4_user_percent_define_variables and
b4_user_percent_code_qualifiers.
* data/c++.m4: Where setting default values for b4_parser_class_name,
b4_location_type, b4_filename_type, b4_namespace, and
b4_define_location_comparison, update their names to the
b4_percent_define_ namespace.
* data/glr.c: Don't use b4_check_percent_define_variables and
b4_check_percent_code_qualifiers. Use b4_get_percent_code.
* data/glr.cc, data/lalr1.cc: Likewise, and use b4_get_percent_define.
(b4_parser_class_name, b4_namespace): Define these using
b4_get_percent_define for parser_class_name and namespace. Normally
this would be a bad idea since there might be cases when the variables
aren't used, but these variables are too pervasive in these skeletons
for that to be a problem.
* data/location.cc: Use b4_get_percent_define.
* data/push.c: Don't use b4_check_percent_define_variables and
b4_check_percent_code_qualifiers. Use b4_get_percent_code.
* data/yacc.c: Likewise, and don't call m4_exit in
b4_use_push_for_pull_if or m4_wrap code will never execute.
* src/muscle_tab.c, src/muscle_tab.h (muscle_grow_used_name_list):
Rename to...
(muscle_grow_user_name_list): ... this for consistency with the
terminology used in bison.m4.
* src/parse-gram.y (prologue_declaration): Prepend "percent_define_" to
%define variable names, and rename muscle used_percent_define_variables
to user_percent_define_variables.
(grammar_declaration): Rename muscle used_percent_code_qualifiers to
user_percent_code_qualifiers.
(content): Remove.
(content.opt): Replace content RHS with STRING RHS so %define "NAME"
{CODE} form is no longer accepted.
* tests/input.at (Reject bad %code qualifiers): Rename to...
(Reject unused %code qualifiers): ... this, and update test output.
(%define error): Update test output.
unrecognized %code qualifiers. Check for redefined %define variables.
* data/bison.m4 (b4_check_for_unrecognized_names): New macro that
generalizes...
(b4_check_percent_code_qualifiers): ... this, which now wraps it.
(b4_check_percent_define_variables): New, also wraps it.
* data/glr.c: Unless glr.cc is wrapping glr.c, declare no valid %define
variables using b4_check_percent_define_variables.
* data/glr.cc, data/lalr1.cc: Declare the valid %define variables as
all those exercised in the test suite and all those listed in the
`Default values' section of c++.m4. Are there others?
* data/push.c, data/yacc.c: Declare no valid %define variables.
* src/muscle_tab.c, src/muscle_tab.h (muscle_find_const): New function,
similar to muscle_find, but it works even when the muscle stores a
const value.
(muscle_grow_used_name_list): New function for constructing the used
name list muscles that b4_check_for_unrecognized_names requires.
* src/parse-gram.y (prologue_declaration): Warn if a variable is
%define'd more than once. Define the b4_used_percent_define_variables
muscle with muscle_grow_used_name_list.
(grammar_declaration): Abbreviate %code code with
muscle_grow_used_name_list.
* tests/input.at (%define errors): New.
skeletons, and use this for %code qualifier complaints.
* data/bison.m4 (b4_error_at): New, invoked by...
(b4_warn_at, b4_complain_at, b4_fatal_at): ... these new macros to wrap
the skeleton scanner's new @warn_at(...@), @complain_at(...@), and
@fatal_at(...@) directives.
(b4_check_percent_code_qualifiers): Rewrite to expect locations for
qualifiers in b4_used_percent_code_qualifiers and to use
b4_complain_at.
* src/location.c, src/location.h (boundary_set_from_string): New global
function.
* src/muscle_tab.c, src/muscle_tab.h (muscle_boundary_grow): New global
function.
* src/parse-gram.y (grammar_declaration): Add locations for qualifiers
to b4_used_percent_code_qualifiers.
* src/scan-skel.l (fail_for_at_directive_too_few_args): New static
function.
(AT_DIRECTIVE_ARGC_MAX): Increase for boundary arguments.
(lineno): Rename to...
(out_lineno): ... this so I don't misunderstand it again.
(SC_AT_DIRECTIVE_SKIP_WS): Don't increment out_lineno for newlines
here; these newlines are in the input but not the output file.
(SC_AT_DIRECTIVE_ARG): Likewise. Extract directive execution to...
(at_directive_perform): ... this new static function, and add handling
of new @warn_at(...@), @complain_at(...@), and @fatal_at(...@)
directives.
* tests/input.at (Reject bad %code qualifiers): Update test output with
locations and extend.
* tests/output.at (Output file name: [, Output file name: ]): Remove
bogus comment about these tests failing.
* data/bison.m4 (b4_check_percent_code_qualifiers): Expect qualifiers
in b4_used_percent_code_qualifiers to be double-M4-quoted. Rewrite
documentation and add examples.
* src/parse-gram.y (grammar_declaration): Double-M4-quote those
qualifiers here.
unreliable -- especially when they're hidden inside another macro.
* data/bison.m4, data/c++-skel.m4, data/c++.m4, data/c-skel.m4,
data/c.m4: Remove m4_divert(-1).
* data/glr.c, data/glr.cc, data/lalr1.cc, data/location.cc,
data/push.c, data/yacc.c: Likewise, and replace m4_divert(0) with
m4_divert_push(0) and m4_divert_pop(0).
* data/output.c (output_skeleton): Don't add an m4_divert_push(0) and
an m4_wrap([m4_divert_pop(0)]) to the M4. Diversion -1, which is
pushed and popped by m4sugar, should be first on the stack.
Provide warn, complain, and fatal function callbacks to the skeletons.
This provides more flexibility than m4_fatal, improves the error
message format, and captures messages for translation. Discussed
starting at
<http://lists.gnu.org/archive/html/bison-patches/2006-12/msg00063.html>.
* data/bison.m4 (b4_error): New, invoked by...
(b4_warn, b4_complain, b4_fatal): ... these new macros to wrap the
skeleton scanner's new @warn(...@), @complain(...@), and @fatal(...@)
directives. Because these M4 macros might be called when the current
diversion is -1 or 0, m4_divert_push and m4_divert_pop is used; thus
the previous removal of uses of m4_divert, which caused trouble.
(b4_check_percent_code_qualifiers): Use b4_complain instead of
m4_fatal to report unrecognized %code qualifiers.
* data/c++-skel.m4: Use b4_complain instead of m4_fatal to report C++
push parser requests.
* data/glr.c: Use b4_complain instead of m4_fatal to report
non-deterministic push parser requests.
Update @output usage to @output(...@) form.
* data/glr.cc, data/lalr1.cc: Use b4_fatal instead of m4_fatal to
report missing %defines. Update @output usage to @output(...@) form.
* data/location.cc, data/push.c, data/yacc.c: Update @output usage to
@output(...@) form.
* src/main.c (main): Invoke skel_scanner_free.
* src/scan-skel.h (skel_scanner_free): Prototype new function.
* src/scan-skel.l (FLEX_NO_OBSTACK): Don't define; we now need the
obstack_for_string from flex-scanner.h.
(YY_DECL): Use to declare skel_lex static.
(decode_at_digraphs): Remove; now handled in the new
SC_AT_DIRECTIVE_ARG start condition.
(fail_for_at_directive_too_many_args, fail_for_invalid_at): New static
functions.
(at_directive_name, AT_DIRECTIVE_ARGC_MAX, at_directive_argc,
at_directive_argv): New static globals.
(INITIAL): Use fail_for_invalid_at.
Don't parse `@output file_name\n' or `@basename(...@)'. Instead,
recognize the start of a generalized `@directive(...@)' form and
start...
(SC_AT_DIRECTIVE_ARG): ... this new start condition to parse the
directive args (using the new obstack_for_string), to decode the
contained @ diagraphs, and to perform the directive. It recognizes
@basename(...@), @warn(...@), @complain(...@), @fatal(...@), and
@output(...@).
(SC_AT_DIRECTIVE_SKIP_WS): New start condition started by
SC_AT_DIRECTIVE_ARG to skip whitespace after the argument delimiter,
`@,'.
(scan_skel): Initialize obstack_for_string on the first call.
(skel_scanner_free): New function to free obstack_for_string.
* tests/input.at (Reject bad %code qualifiers): Update test output.
%provides, and %code-top) into a single %code directive with an
optional qualifier field. Discussed at
<http://lists.gnu.org/archive/html/bison-patches/2007-01/msg00012.html>.
* NEWS (2.3a+): Rewrite the existing entry for the prologue
alternatives.
* doc/bison.texinfo (Prologue Alternatives): Update.
(Decl Summary): Update to %code "requires" and %code "provides".
(Calc++ Parser): Update to %code "requires".
(Bison Symbols): Remove entries for %requires, %provides, and
%code-top. Rewrite %code entry, and add a %code "QUALIFIER" entry.
* data/bison.m4 (b4_user_provides, b4_user_requires): Remove as these
are replaced by b4_percent_code_provides and b4_percent_code_requires,
which are skeleton-specific.
(b4_check_percent_code_qualifiers): New. A skeleton can use this to
declare what %code qualifiers it supports and to complain if any other
qualifiers were used in the grammar.
* data/glr.cc: Update to use b4_user_code([b4_percent_code_requires])
and b4_user_code([b4_percent_code_provides]) in place of
b4_user_requires and b4_user_provides.
* data/glr.c, data/lalr1.cc, data/push.c, data/yacc.c: Likewise.
Add b4_user_code([b4_percent_code_top]) and
b4_user_code([b4_percent_code]).
Invoke b4_check_percent_code_qualifiers.
* src/parse-gram.y (PERCENT_CODE_TOP, PERCENT_PROVIDES,
PERCENT_REQUIRES): Remove.
(grammar_declaration): Remove RHS's for %code-top, %provides, and
%requires. Rewrite the %code RHS as the unqualified form defining the
muscle b4_percent_code. Add another RHS for the qualified %code form,
which defines muscles of the form b4_percent_code_QUALIFIER and the
b4_used_percent_code_qualifiers muscle.
* src/scan-gram.l (PERCENT_CODE_TOP, PERCENT_PROVIDES,
PERCENT_REQUIRES): Remove.
* tests/actions.at (_AT_CHECK_PRINTER_AND_DESTRUCTOR): Update to use
%code "requires" and %code "provides".
* tests/input.at (Reject bad %code qualifiers): New.
* src/symtab.h (symbol, semantic_type): Remove destructor_location and
printer_location members, and change the type of the destructor and
printer members to code_props.
(symbol_destructor_set, symbol_destructor_get, symbol_printer_set,
symbol_printer_get, semantic_type_destructor_set,
semantic_type_printer_set, default_tagged_destructor_set,
default_tagless_destructor_set, default_tagged_printer_set,
default_tagless_printer_set): Use code_props in arguments and return
types in place of char const * and location.
(symbol_destructor_location_get, symbol_printer_location_get): Remove
since the locations are now contained in the return of
symbol_destructor_get and symbol_printer_get.
* src/output.c (symbol_destructors_output, symbol_printers_output):
Replace with...
(symbol_code_props_output): ... this to eliminate duplicate code.
(output_skeleton): Update to use symbol_code_props_output.
* src/reader.c (symbol_should_be_used): Update use of
symbol_destructor_get.
* src/symlist.c (symbol_list_destructor_set, symbol_list_printer_set):
Update uses of the various _destructor_set and _printer_set functions.
* src/symtab.c: (default_tagged_destructor_location,
default_tagless_destructor_location, default_tagged_printer_location,
default_tagless_printer_location): Remove since we...
(default_tagged_destructor, default_tagless_destructor,
default_tagged_printer, default_tagless_printer): ... change the type
of these to code_props.
(symbol_new, semantic_type_new, symbol_destructor_set,
semantic_type_destructor_set, symbol_destructor_get,
symbol_printer_set, semantic_type_printer_set, symbol_printer_get,
symbol_check_alias_consistency, default_tagged_destructor_set,
default_tagless_destructor_set, default_tagged_printer_set,
default_tagless_printer_set): Update.
(symbol_destructor_location_get, symbol_printer_location_get): Remove.
(SYMBOL_CODE_PRINT): New similar to SYMBOL_ATTR_PRINT but for
code_props members.
(symbol_print): Use SYMBOL_CODE_PRINT.
* src/parse-gram.y (prologue_declaration, braceless, epilogue.opt):
Update all uses of translate_* functions to use the new code_props
interface and to use gram_scanner_last_string_free and
code_scanner_last_string_free where possible.
(grammar_declaration): symbol_list_destructor_set and
symbol_list_printer_set now perform the translation, so don't do it
here. Use gram_scanner_last_string_free where possible.
* src/scan-code.h, src/scan-code.l (translate_symbol_action,
translate_code): Remove, no longer used.
* src/symlist.h, src/symlist.c (symbol_list_destructor_set,
symbol_list_printer_set): Perform code translation here rather than
depending on the caller to do so.
* src/symlist.h (struct symbol_list): Correct some documentation typos.
* src/scan-gram.h (gram_last_string): Remove declaration.
* src/scan-gram.l (last_string): Declare it static.
destructors, printers, and actions into a code_props structure and
interface. This patch merely implements code_props in scan-code.h and
scan-code.l. Future patches will rewrite other modules to use it.
Discussed starting at
<http://lists.gnu.org/archive/html/bison-patches/2006-11/msg00020.html>.
* src/location.h (EMPTY_LOCATION_INIT): Define so that it's easier to
consistently initialize const structs that have an empty location
field.
* src/location.c (empty_location): Initialize with EMPTY_LOCATION_INIT
to ensure consistency.
* src/scan-code.h (code_props): New structure.
(code_props_none_init, CODE_PROPS_NONE_INIT, code_props_none): New
function, macro, and const global variable for initializing a
code_props with no code.
(code_props_plain_init, code_props_symbol_action_init,
code_props_rule_action_init, code_props_translate_code): The rest of
the new code_props functional interface. Among other things, the init
functions set the code_props kind field so that
code_props_translate_code will know whether to behave like
translate_symbol_action, translate_rule_action, or translate_code.
These old translate functions must remain until all other modules are
updated to use the new code_props interface.
(code_scanner_last_string_free): New function similar to
gram_scanner_last_string_free.
(code_scanner_free): Add documentation.
* src/scan-code.l: Implement the new interface.
(code_lex): Make it static, add a code_props* argument, and remove the
rule argument.
(last_string): New static global similar to the one in scan-gram.l.
(SC_RULE_ACTION): Update to use the code_props* argument to code_lex
instead of rule.
(SC_SYMBOL_ACTION): For $$, set the is_value_used member of the
code_props since Bison may one day use this information for destructors
and printers.
(<*><<EOF>>): Use STRING_FINISH so that last_string is set.
(handle_action_dollar): Use symbol_list_n_get and set used flag
directly since symbol_list_n_used_set is removed.
(translate_action): Add a code_props* argument and remove the rule,
action, and location arguments. Pass the code_props* on to code_lex.
(translate_rule_action, translate_symbol_action, translate_code):
Rewrite as wrappers around the new code_props interface.
* src/symlist.h, src/symlist.c (symbol_list_n_used_set): Remove since
it would eventually need to break the encapsulation of code_props.
place of pull parsing where available.
* Makefile.am (maintainer-push-check): New.
* data/bison.m4 (b4_use_push_for_pull_if): New.
* data/push.c: Redefine b4_push_if and b4_use_push_for_pull_if
appropriately based on their existing values.
(yypush_parse): Don't print push-parser-specific diagnostics if push
parsing is being used in place of pull parsing.
* data/yacc.c: If push parsing should replace pull parsing, redirect to
push.c.
* src/output.c (prepare): Check BISON_USE_PUSH_FOR_PULL environment
variable, and insert b4_use_push_for_pull_flag into muscles.
* tests/Makefile.am (maintainer-push-check): New.
(whether successful or failed) so that yypush_parse can be invoked
again to start a new parse using the same yypstate.
* tests/torture.at (AT_DATA_STACK_TORTURE): For push mode, extend to
check multiple yypull_parse invocations on the same yypstate. For pull
mode, extend to check multiple yyparse invocations.
(Exploding the Stack Size with Alloca): Extend to try with
%push-pull-parser.
(Exploding the Stack Size with Malloc): Likewise.
* tests/calc.at (Simple LALR Calculator): Don't specify
%skeleton "push.c" since %push-pull-parser implies that now.
* tests/headers.at (export YYLTYPE): Don't check for the push
declarations. Otherwise, this test case can't be used to see if push
mode can truly emulate pull mode.
* tests/input.at (Torturing the Scanner): Likewise.
* tests/local.at (AT_YACC_OR_PUSH_IF, AT_PUSH_IF): Remove.
(AT_YYERROR_SEES_LOC_IF): Rather than AT_YACC_OR_PUSH_IF, use
AT_YACC_IF, which now includes the case of push mode since %skeleton
need not be used for push mode. This will be more intuitive once
push.c is renamed to yacc.c.
instead of passing a yylexp argument to yypull_parse, and don't
generate yypull_parse or yyparse unless %push-pull-parser is declared.
Discussed starting at
<http://lists.gnu.org/archive/html/bison-patches/2006-12/msg00163.html>.
* data/bison.m4 (b4_pull_if): New.
* data/c.m4 (b4_identification): Define YYPULL similar to YYPUSH.
* data/push.c: Improve M4 quoting a little.
(b4_generate_macro_args, b4_parenthesize): Remove.
(yyparse): If there's a b4_prefix, #define this to b4_prefix[parse]
any time a pull parser is requested.
Don't #define this as a wrapper around yypull_parse. Instead, when
both push and pull are requested, make it a function that does that
same thing.
(yypull_parse): If there's a b4_prefix, #define this to
b4_prefix[pull_parse] when both push and pull are requested.
Don't define this as a function unless both push and pull are
requested.
Remove the yylexp argument and hard-code yylex invocation instead.
* etc/bench.pl.in (bench_grammar): Use %push-pull-parser instead of
%push-parser.
* src/getargs.c (pull_parser): New global initialized to true.
* getargs.h (pull_parser): extern it.
* src/output.c (prepare): Insert pull_flag muscle.
* src/parse-gram.y (PERCENT_PUSH_PULL_PARSER): New token.
(prologue_declaration): Set both push_parser and pull_parser = true for
%push-pull-parser. Set push_parser = true and pull_parser = false for
%push-parser.
* src/scan-gram.l: Don't accept %push_parser as an alternative to
%push-parser since there's no backward-compatibility concern here.
Scan %push-pull-parser.
* tests/calc.at (Simple LALR(1) Calculator): Use %push-pull-parser
instead of %push-parser.
* tests/headers.at (export YYLTYPE): Make yylex static, and don't
prototype it in the module that calls yyparse.
* tests/input.at (Torturing the Scanner): Likewise.
* tests/local.at (AT_PUSH_IF): Check for %push-pull-parser as well.
deserves most of the credit).
* Makefile.am (SUBDIRS): Add etc subdirectory.
* configure.ac (AC_CONFIG_FILES): Add etc/bench.pl and etc/Makefile.
* data/push.c (b4_declare_parser_state_variables): Move yyn, yyresult,
yytoken, yyval, and yyloc declarations to...
(yyparse or yypush_parse): ... here to improve performance. For
yypush_parse invocations after the first, be sure to assign yyn its old
value again.
(yypstate_new): Don't bother initializing the yyresult field since the
initial value isn't used.
(yyn, yyresult, yytoken, yyval, yyloc): For each NAME in this list,
remove the #define that, in push mode, set it to yyps->NAME.
* etc/Makefile.am: New.
* etc/bench.pl: Remove and build it instead from...
* etc/bench.pl.in: ... this new file. Use @abs_top_builddir@ to invoke
"tests/bison" from the build directory by default rather than just
invoking "bison" from $PATH.
(calc_grammar): Update push parser code: don't declare yylval globally,
don't define yyparse_wrapper, and don't #define yyparse.
(bench_grammar): Update to check all working combinations of yacc.c,
push.c, impure, pure, pull, and push.
* data/push.c: (b4_generate_macro_args, b4_parenthesize): New macros.
(yypull_parse): New function wrapping yypush_parse.
(yyparse): New #define wrapping yypull_parse.
* tests/calc.at (_AT_DATA_CALC_Y): Call yyparse even when %push-parser
is declared.
* tests/headers.at (export YYLTYPE): Make yylex global. For push mode,
prototype yylex in the module that calls yyparse, and don't prototype
yyparse there. Otherwise, the yyparse expansion won't compile.
* tests/input.at (Torturing the Scanner): Likewise.
longer implies %pure-parser. The point of this change is to move
towards being able to test the push parser code by running the entire
test suite as if %push-parser had been declared.
* data/push.c (yypush_parse): For impure mode, remove the
yypushed_char, yypushed_val, and yypushed_loc arguments.
Instead, declare these as local variables initialized to the global
yychar, yylval, and yylloc.
For the first yypush_parse invocation only, restore the initial values
of these global variables when it's time to read a token since they
have been overwritten.
* src/parse-gram.y (prologue_declaration): Don't set pure_parser for
%push-parser.
* tests/calc.at (Simple LALR(1) Calculator): Always declare
%pure-parser along with %push-parser since this test case was designed
for pure push parsers.
* tests/local.at (AT_PURE_OR_PUSH_IF): Remove unused.
(AT_YACC_OR_PUSH_IF): New.
(AT_YYERROR_SEES_LOC_IF): Fix enough that the test suite passes, but
add a note that it's still wrong for some cases (as it has been for a
while).
(AT_PURE_LEX_IF): Use AT_PURE_IF instead of AT_PURE_OR_PUSH_IF since
%push-parser no longer implies %pure-parser.
the push parser code. This patch enables yynerrs in push mode.
* data/push.c: Reformat M4 a little.
(b4_yyerror_range): Remove and convert all uses to just yyerror_range.
(b4_declare_scanner_communication_variables): Don't omit yynerrs just
because push mode is on. Instead, if pure mode is on, move yynerrs
to...
(b4_declare_parser_state_variables): ... here.
(yynerrs, yyerror_range): For push mode, #define each NAME in this list
to yyps->NAME so it can be used in yypush_parse.
(yypush_parse): Don't omit uses of yynerrs in push mode.