]> git.saurik.com Git - bison.git/blobdiff - ChangeLog
TODO: yyfmt.
[bison.git] / ChangeLog
index b36524b68c8173080729184d65c90b8739241d99..0409a5debfee265ac31831ead66a8c1516c739bc 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,235 @@
+2008-11-11  Akim Demaille  <demaille@gostai.com>
+
+       TODO: yyfmt.
+       * TODO (yysyntax_error): New item.
+
+2008-11-11  Akim Demaille  <demaille@gostai.com>
+
+       Prefer M4 to CPP.
+       * data/lalr1.cc: Use b4_error_verbose_if instead of #if
+       YYERROR_VERBOSE.
+
+2008-11-11  Akim Demaille  <demaille@gostai.com>
+
+       Support i18n of the parse error messages.
+       * TODO (lalr1.cc/I18n): Remove.
+       * data/lalr1.cc (yysyntax_error_): Support the translation of the
+       error messages, as done in yacc.c.
+       Stay within the yy* pseudo namespace.
+
+2008-11-11  Akim Demaille  <demaille@gostai.com>
+
+       More TODO.
+       * TODO (single stack, yysyntax_error): New.
+
+2008-11-11  Akim Demaille  <demaille@gostai.com>
+
+       Make it possible to return a symbol_type from yylex.
+       * data/lalr1.cc (b4_lex_symbol_if): New.
+       (parse): When lex_symbol is defined, expected yylex to return the
+       complete lookahead.
+       * etc/bench.pl.in (generate_grammar_list): Extend to support this
+       yylex interface.
+       (bench_variant_parser): Exercise it.
+
+2008-11-11  Akim Demaille  <demaille@gostai.com>
+
+       Remove useless bench case.
+       * etc/bench.pl.in (bench_variant_parser): VARIANT_DESTROY is
+       no longer used.
+
+2008-11-11  Akim Demaille  <demaille@gostai.com>
+
+       Improve display of directives.
+       * etc/bench.pl.in (parse_term): Don't add useless eol.
+
+2008-11-11  Akim Demaille  <demaille@gostai.com>
+
+       Use string_cast in the bench.
+       * etc/bench.pl.in (generate_grammar_list): Define and use
+       string_cast.
+
+2008-11-11  Akim Demaille  <demaille@gostai.com>
+
+       Replace yychar with a Boolean.
+       * data/lalr1.cc (parse::yychar): Replace by...
+       (parse::yyempty): this.
+
+2008-11-11  Akim Demaille  <demaille@gostai.com>
+
+       Factor the tables.
+       * TODO: New item.
+
+2008-11-11  Akim Demaille  <demaille@gostai.com>
+
+       Let yytranslate handle the eof case.
+       * data/lalr1.cc (yytranslate_): Handle the EOF case.
+       Adjust callers.
+       No longer expect yychar to be equal to yyeof_, rather, test the
+       lookahead's (translated) kind.
+
+2008-11-11  Akim Demaille  <demaille@gostai.com>
+
+       yychar cannot be empty in yyerrlab.
+       * TODO (yychar == yyempty_): New.
+       * data/lalr1.cc: Remove the handling of this case.
+       This eases forthcoming changes related to yychar and yytranslate.
+
+2008-11-11  Akim Demaille  <demaille@gostai.com>
+
+       Bench: syntactic sugar for %define/#define.
+       * etc/bench.pl.in (parse_dirs): Support %d and #d with arguments.
+       (&bench_push_parser, bench_variant_parser): Use this feature.
+       (&eat): New.
+       Use it.
+
+2008-11-11  Akim Demaille  <demaille@gostai.com>
+
+       Less memory pressure on the "list" bench.
+       * etc/bench.pl.in (generate_grammar_list): Do not accumulate all
+       the values, to limit memory pressure.
+
+2008-11-11  Akim Demaille  <demaille@gostai.com>
+
+       Introduce make_symbol.
+       make_symbol provides a means to construct a full symbol (kind, value,
+       location) in a single shot.  It is meant to be a Symbol constructor,
+       parameterized by the symbol kind so that overloading would prevent
+       incorrect kind/value pairs.  Unfortunately parameterized constructors do
+       not work well in C++ (unless the parameter also appears as an argument,
+       which is not acceptable), hence the use of a function instead of a
+       constructor.
+       
+       * data/lalr1.cc (b4_symbol_constructor_declaration_)
+       (b4_symbol_constructor_declarations)
+       (b4_symbol_constructor_specialization_)
+       (b4_symbol_constructor_specializations)
+       (b4_symbol_constructor_definition_)
+       (b4_symbol_constructor_definitions): New.
+       Use them where appropriate to generate declaration, declaration of
+       the specializations, and implementations of the templated
+       overloaded function "make_symbol".
+       (variant::variant): Always define a default ctor.
+       Also provide a copy ctor.
+       (symbol_base_type, symbol_type): New ctor overloads for value-less
+       symbols.
+       (symbol_type): Now public, so that functions such as yylex can use
+       it.
+
+2008-11-11  Akim Demaille  <demaille@gostai.com>
+
+       Inform m4 whether a tag is a valid id.
+       * src/output.c (is_identifier): New.
+       (symbol_definitions_output): Use it to define tag_is_id.
+       But maybe this should be done at m4 level?
+
+2008-11-11  Akim Demaille  <demaille@gostai.com>
+
+       Test 214 was failing: it greps with a pattern containing [     ]*
+       which obviously meant to catch spaces and tabs, but contained only
+       spaces. Tabulations in sources are a nuisance, so to simplify the
+       matter, get rid of all the tabulations in the Java sources.  The
+       other skeletons will be treated equally later.
+
+       * data/java.m4, data/lalr1.java: Untabify.
+       * tests/java.at: Simplify AT_CHECK_JAVA_GREP invocations:
+       tabulations are no longer generated.
+
+2008-11-11  Paolo Bonzini  <bonzini@gnu.org>
+
+       * bootstrap.conf: Replace m4/warning.m4 with warnings module.
+       * configure.ac: Adjust usage.
+       * lib/Makefile.am: Replace $(WARNING_CFLAGS) with $(WARN_CFLAGS).
+       * src/Makefile.am: Replace $(WARNING_CFLAGS) with $(WARN_CFLAGS).
+       * tests/atlocal.in: Replace $(WARNING_*FLAGS) with $(WARN_*FLAGS).
+
+2008-11-10  Di-an Jan  <dianj@freeshell.org>
+
+       Workaround Java's ``code too large'' problem for parser tables
+       in most cases, by using one function per initialization.
+       * data/java.m4 (b4_typed_parser_table, b4_integral_parser_table): New.
+       * data/lalr1.java (yypact_, yydefact_, yypgoto_, yydefgoto_,
+       yytable_, yycheck_, yystos_, yytoken_number_, yyr1_, yyr2_, yyrhs_
+       yyprhs_, yyrline_, yytranslate_table_): Use b4_integral_parser_table.
+       (yytname_): Use b4_typed_parser_table.
+       * doc/bison.texinfo (Java Bison Interface): Add note on Java's
+       ``code too large'' error.
+
+2008-11-10  Di-an Jan  <dianj@freeshell.org>
+
+       * NEWS: Document them.
+
+       General Java skeleton improvements.
+       * configure.ac (gt_JAVACOMP): Request target of 1.4, which allows
+       using gcj < 4.3 in the testsuite, according to comments in
+       gnulib/m4/javacomp.m4.
+       * data/java.m4 (stype, parser_class_name, lex_throws, throws,
+       location_type, position_type): Remove extraneous brackets from
+       b4_percent_define_default.
+       (b4_lex_param, b4_parse_param): Remove extraneous brackets from
+       m4_define and m4_define_default.
+       * data/lalr1.java (b4_pre_prologue): Change to b4_user_post_prologue,
+       which marks the end of user code with appropriate syncline, like all
+       the other skeletons.
+       (b4_user_post_prologue): Add.  Don't silently drop.
+       (yylex): Remove.
+       (parse): Inline yylex.
+       * doc/bison.texinfo (bisonVersion, bisonSkeleton): Document.
+       (%{...%}): Fix typo of %code imports.
+       * tests/java.at (AT_JAVA_COMPILE): Add "java" keyword.
+
+       Support annotations on parser class with %define annotations.
+       * data/lalr1.java (annotations): Add to parser class modifier.
+       * doc/bison.texinfo (Java Parser Interface): Document
+       %define annotations.
+       (Java Declarations Summary): Document %define annotations.
+       * tests/java.at (Java parser class modifiers): Test annotations.
+
+       Do not generate code for %error-verbose unless requested.
+       * data/lalr1.java (errorVerbose): Rename to yyErrorVerbose.
+       Make private.  Make conditional on %error-verbose.
+       (getErrorVerbose, setErrorVerbose): New.
+       (yytnamerr_): Make conditional on %error-verbose.
+       (yysyntax_error): Make some code conditional on %error-verbose.
+       * doc/bison.texinfo (Java Bison Interface): Remove the parts
+       about %error-verbose having no effect.
+       (getErrorVerbose, setErrorVerbose): Document.
+
+       Move constants for token names to Lexer interface.
+       * data/lalr1.java (Lexer): Move EOF, b4_token_enums(b4_tokens) here.
+       * data/java.m4 (b4_token_enum): Indent for move to Lexer interface.
+       (parse): Qualify EOF to Lexer.EOF.
+       * doc/bison.texinfo (Java Parser Interface): Move documentation of
+       EOF and token names to Java Lexer Interface.
+       * tests/java.at (_AT_DATA_JAVA_CALC_Y): Remove Calc qualifier.
+
+       Make yyerror public.
+       * data/lalr1.java (Lexer.yyerror): Use longer parameter name.
+       (yyerror): Change to public.  Add Javadoc comments.  Use longer
+       parameter names.  Make the body rather than the declarator
+       conditional on %locations.
+       * doc/bison.texinfo (yyerror): Document.  Don't mark as protected.
+
+       Allow user to add code to the constructor with %code init.
+       * data/java.m4 (b4_init_throws): New, for %define init_throws.
+       * data/lalr1.java (YYParser.YYParser): Add b4_init_throws.
+       Add %code init to the front of the constructor body.
+       * doc/bison.texinfo (YYParser.YYParser): Document %code init
+       and %define init_throws.
+       (Java Declarations Summary): Document %code init and
+       %define init_throws.
+       * tests/java.at (Java %parse-param and %lex-param): Adjust grep.
+       (Java constructor init and init_throws): Add tests.
+
+2008-11-10  Akim Demaille  <demaille@gostai.com>
+
+       Update TODO.
+       * TODO (-D): is implemented.
+       (associativity): Same precedence must have the same associativity.
+       For instance, how can a * b / c be parsed if * is %left and / is
+       %right?
+       (YYERRORCODE, YYFAIL, YYBACKUP): New.
+
 2008-11-10  Akim Demaille  <demaille@gostai.com>
 
        Formatting changes.
 2008-11-10  Akim Demaille  <demaille@gostai.com>
 
        Formatting changes.
        Make parser::yytranslate static.
        Small speedup (1%) on the list grammar.  And makes yytranslate_ available
        in non member functions.
        Make parser::yytranslate static.
        Small speedup (1%) on the list grammar.  And makes yytranslate_ available
        in non member functions.
-       
+
        * data/lalr1.cc (yytranslate_): Does not need to be a instance
        function.
 
        * data/lalr1.cc (yytranslate_): Does not need to be a instance
        function.
 
 
        Use "enum" for integral constants.
        This is just nicer to read, I observed no speedup.
 
        Use "enum" for integral constants.
        This is just nicer to read, I observed no speedup.
-       
+
        * data/lalr1.cc (yyeof_, yylast_, yynnts_, yyempty_, yyfinal_)
        (yterror_, yyerrcode_, yyntokens_): Define as members of an enum.
        (yyuser_token_number_max_, yyundef_token_): Move into...
        * data/lalr1.cc (yyeof_, yylast_, yynnts_, yyempty_, yyfinal_)
        (yterror_, yyerrcode_, yyntokens_): Define as members of an enum.
        (yyuser_token_number_max_, yyundef_token_): Move into...
        hard to filter these tables when only a subset of the symbols (say the
        tokens, or the nterms, or the tokens that have and external number
        *and* a type-name) was of interest.
        hard to filter these tables when only a subset of the symbols (say the
        tokens, or the nterms, or the tokens that have and external number
        *and* a type-name) was of interest.
-       
+
        Now instead of monolithic tables, we define one macro per cell.  For
        instance "b4_symbol(0, tag)" is a macro name which contents is
        self-decriptive.  The macro "b4_symbol" provides easier access to
        these cells.
        Now instead of monolithic tables, we define one macro per cell.  For
        instance "b4_symbol(0, tag)" is a macro name which contents is
        self-decriptive.  The macro "b4_symbol" provides easier access to
        these cells.
-       
+
        * src/output.c (type_names_output): Remove.
        (symbol_numbers_output, symbol_definitions_output): New.
        (muscles_output): Call them.
        * src/output.c (type_names_output): Remove.
        (symbol_numbers_output, symbol_definitions_output): New.
        (muscles_output): Call them.
 
        Support constructor with an argument.
        This improves the "list" bench by 2%.
 
        Support constructor with an argument.
        This improves the "list" bench by 2%.
-       
+
        * data/lalr1.cc (variant::build): Add an overloaded version with
        an argument.
        * tests/c++.at (AT_CHECK_VARIANT): Check it.
        * data/lalr1.cc (variant::build): Add an overloaded version with
        an argument.
        * tests/c++.at (AT_CHECK_VARIANT): Check it.
        Unfortunately it is not possible to reuse the %prec directive.  This
        is because to please POSIX, we do not require to end the rules with a
        semicolon.  As a result,
        Unfortunately it is not possible to reuse the %prec directive.  This
        is because to please POSIX, we do not require to end the rules with a
        semicolon.  As a result,
-       
+
        foo: bar %prec baz
        foo: bar %prec baz
-       
+
        is ambiguous: either a rule which precedence is that of baz, or a rule,
        and then a declaration of the precedence of the token baz.
        is ambiguous: either a rule which precedence is that of baz, or a rule,
        and then a declaration of the precedence of the token baz.
-       
+
        * doc/bison.texinfo: Document %precedence.
        (Precedence Only): New.
        * src/assoc.h, src/assoc.c (precedence_assoc): New.
        * doc/bison.texinfo: Document %precedence.
        (Precedence Only): New.
        * src/assoc.h, src/assoc.c (precedence_assoc): New.
        To display rhs symbols before a reduction, we used information about the rule
        reduced, which required the tables yyrhs and yyprhs.  Now use rely only on the
        state stack to get the same information.
        To display rhs symbols before a reduction, we used information about the rule
        reduced, which required the tables yyrhs and yyprhs.  Now use rely only on the
        state stack to get the same information.
-       
+
        * data/lalr1.cc (b4_rhs_data, b4_rhs_state): New.
        Use them.
        (parser::yyrhs_, parser::yyprhs_): Remove.
        * data/lalr1.cc (b4_rhs_data, b4_rhs_state): New.
        Use them.
        (parser::yyrhs_, parser::yyprhs_): Remove.
 
        Avoid empty-if warnings.
        Reported by Quentin Hocquet.
 
        Avoid empty-if warnings.
        Reported by Quentin Hocquet.
-       
+
        * data/lalr1-fusion.cc (YY_SYMBOL_PRINT, YY_REDUCE_PRINT)
        (YY_STACK_PRINT): Provide some contents even when !YYDEBUG.
 
        * data/lalr1-fusion.cc (YY_SYMBOL_PRINT, YY_REDUCE_PRINT)
        (YY_STACK_PRINT): Provide some contents even when !YYDEBUG.
 
        This is used to help the user catch cases where some value gets
        ovewritten by a new one.  This should not happen, as this will
        probably leak.
        This is used to help the user catch cases where some value gets
        ovewritten by a new one.  This should not happen, as this will
        probably leak.
-       
+
        Unfortunately this uncovered a bug in the C++ parser itself: the
        lookahead value was not destroyed between two calls to yylex.  For
        instance if the previous lookahead was a std::string, and then an int,
        then the value of the std::string was correctly taken (i.e., the
        lookahead was now an empty string), but std::string structure itself
        was not reclaimed.
        Unfortunately this uncovered a bug in the C++ parser itself: the
        lookahead value was not destroyed between two calls to yylex.  For
        instance if the previous lookahead was a std::string, and then an int,
        then the value of the std::string was correctly taken (i.e., the
        lookahead was now an empty string), but std::string structure itself
        was not reclaimed.
-       
+
        This is now done in variant::build(other&) (which is used to take the
        value of the lookahead): other is not only stolen from its value, it
        is also destroyed.  This incurs a new performance penalty of a few
        percent, and union becomes faster again.
        This is now done in variant::build(other&) (which is used to take the
        value of the lookahead): other is not only stolen from its value, it
        is also destroyed.  This incurs a new performance penalty of a few
        percent, and union becomes faster again.
-       
+
        * data/lalr1-fusion.cc (variant::build(other&)): Destroy other.
        (b4_variant_if): New.
        (variant::built): New.
        * data/lalr1-fusion.cc (variant::build(other&)): Destroy other.
        (b4_variant_if): New.
        (variant::built): New.
        Make variant.yy more complex.
        std::list cannot be copied via memcpy, they are more demanding than
        std::string.  Use one std::list to strengthen the test.
        Make variant.yy more complex.
        std::list cannot be copied via memcpy, they are more demanding than
        std::string.  Use one std::list to strengthen the test.
-       
+
        * examples/variant.yy: Use lalr1-fusion.cc, not lalr1.cc.
        Adjust.
        Create a list of strings, instead of a single large string.
        * examples/variant.yy: Use lalr1-fusion.cc, not lalr1.cc.
        Adjust.
        Create a list of strings, instead of a single large string.
        In order to make it easy to perform benchmarks to ensure that there are no
        performance loss, lalr1.cc is forked into lalr1-fusion.cc.  Eventually,
        lalr1-fusion.cc will replace lalr1.cc.
        In order to make it easy to perform benchmarks to ensure that there are no
        performance loss, lalr1.cc is forked into lalr1-fusion.cc.  Eventually,
        lalr1-fusion.cc will replace lalr1.cc.
-       
+
        Meanwhile, to make sure that lalr1-fusion.cc is correctly exercized by the
        test suite, the user must install a symbolic link from lalr1.cc to it.
        Meanwhile, to make sure that lalr1-fusion.cc is correctly exercized by the
        test suite, the user must install a symbolic link from lalr1.cc to it.
-       
+
        Instead of having three stacks (state, value, location), use a stack
        of triples.  This considerably simplifies the code (and it will be
        easier not to require locations as currently does the C++ parser),
        and also gives a 10% speedup according to etc/bench (probably mainly since
        memory allocation is done once instead of three times).
        Instead of having three stacks (state, value, location), use a stack
        of triples.  This considerably simplifies the code (and it will be
        easier not to require locations as currently does the C++ parser),
        and also gives a 10% speedup according to etc/bench (probably mainly since
        memory allocation is done once instead of three times).
-       
+
        Another motivation is to make it easier to destruct properly
        semantic values: now that they are bound to their state (hence
        symbol type) it will be easier to call the appropriate destructor.
        Another motivation is to make it easier to destruct properly
        semantic values: now that they are bound to their state (hence
        symbol type) it will be easier to call the appropriate destructor.
-       
+
        These changes should probably benefit the C parser too.
        These changes should probably benefit the C parser too.
-       
+
        * data/lalr1.cc: Copy as...  * data/lalr1-fusion.cc: this new
        file.
        (b4_rhs_value, b4_rhs_location): New definitions overriding those
        * data/lalr1.cc: Copy as...  * data/lalr1-fusion.cc: this new
        file.
        (b4_rhs_value, b4_rhs_location): New definitions overriding those
        Push the state, value, and location at the same time.
        This is needed to prepare a forthcoming patch that fuses the three
        stacks into one.
        Push the state, value, and location at the same time.
        This is needed to prepare a forthcoming patch that fuses the three
        stacks into one.
-       
+
        * data/lalr1.cc (parser::yypush_): New.
        (parser::yynewstate): Change the semantics: instead of arriving to
        this label when value and location have been pushed, but yystate
        * data/lalr1.cc (parser::yypush_): New.
        (parser::yynewstate): Change the semantics: instead of arriving to
        this label when value and location have been pushed, but yystate
        variants which (i) requires Boost on the user side, (ii) is slow, and
        (iii) has useless overhead (the parser knows the type of the semantic value
        there is no reason to duplicate this information as Boost.Variants do).
        variants which (i) requires Boost on the user side, (ii) is slow, and
        (iii) has useless overhead (the parser knows the type of the semantic value
        there is no reason to duplicate this information as Boost.Variants do).
-       
+
        This implementation reserves a buffer large enough to store the largest
        objects.  yy::variant implements this buffer.  It was implemented with
        Quentin Hocquet.
        This implementation reserves a buffer large enough to store the largest
        objects.  yy::variant implements this buffer.  It was implemented with
        Quentin Hocquet.
-       
+
        * src/output.c (type_names_output): New.
        (output_skeleton): Invoke it.
        * data/c++.m4 (b4_variant_if): New.
        * src/output.c (type_names_output): New.
        (output_skeleton): Invoke it.
        * data/c++.m4 (b4_variant_if): New.
        Parameterize the extraction of semantic values.
        To make future changes easier, no longer rely on ".TYPE" being the
        way to get a semantic value.
        Parameterize the extraction of semantic values.
        To make future changes easier, no longer rely on ".TYPE" being the
        way to get a semantic value.
-       
+
        * data/c.m4 (b4_symbol_value): New.
        Use it.
        * data/c++.m4, data/yacc.c: Use it.
        * data/c.m4 (b4_symbol_value): New.
        Use it.
        * data/c++.m4, data/yacc.c: Use it.