+2008-11-15 Akim Demaille <demaille@gostai.com>
+
+ Provide convenience constructors for locations and positions.
+ * data/location.cc (position::position): Accept file, line and
+ column as arguments with default values.
+ Always qualify initial line and column literals as unsigned.
+ (location::location): Provide convenience constructors.
+
+2008-11-15 Akim Demaille <demaille@gostai.com>
+
+ Instead of using make_symbol<TOK_FOO>, generate make_FOO for each token type.
+ Using template buys us nothing, and makes it uselessly complex to
+ construct a symbol. Besides, it could not be generalized to other
+ languages, while make_FOO would work in C/Java etc.
+
+ * data/lalr1.cc (b4_symbol_): New.
+ (b4_symbol): Use it.
+ (b4_symbol_constructor_declaration_)
+ (b4_symbol_constructor_definition_): Instead of generating
+ specializations of an overloaded template function, just generate
+ several functions whose names are forged from the token names
+ without the token.prefix.
+ (b4_symbol_constructor_declarations): Generate them for all the
+ symbols, not just by class of symbol type, now that instead of
+ specializing a function template by the token, we generate a
+ function named after the token.
+ (b4_symbol_constructor_specialization_)
+ (b4_symbol_constructor_specializations): Remove.
+ * etc/bench.pl.in: Adjust to this new API.
+
+2008-11-13 Akim Demaille <demaille@gostai.com>
+
+ %define token.prefix.
+ Provide a means to add a prefix to the name of the tokens as output in the
+ generated files. Because of name clashes, it is good to have such a
+ prefix such as TOK_ that protects from names such as EOF, FILE etc.
+ But it clutters the grammar itself.
+
+ * data/bison.m4 (token.prefix): Empty by default.
+ * data/c.m4 (b4_token_enum, b4_token_define): Use it.
+ * data/lalr1.cc (b4_symbol): Ditto.
+
+2008-11-13 Akim Demaille <demaille@gostai.com>
+
+ Compute at M4 time some of the subtractions.
+ * data/lalr1.cc (b4_substract): New.
+ (b4_rhs_data): Use it.
+
+2008-11-13 Akim Demaille <demaille@gostai.com>
+
+ symbol::token.
+ This is allows the user to get the type of a token return by
+ yylex.
+
+ * data/lalr1.cc (symbol::token): New.
+ (yytoknum_): Define when %define lex_symbol, independently of
+ %debug.
+ (yytoken_number_): Move into...
+ (symbol::token): here, since that's the only use.
+ The other one is YYPRINT which was not officially supported
+ by lalr1.cc, and anyway it did not work since YYPRINT uses this
+ array under a different name (yytoknum).
+
+2008-11-13 Akim Demaille <demaille@gostai.com>
+
+ YYERRCODE.
+ * TODO (YYERRCODE): Mention the case of $undef.
+
+2008-11-13 Akim Demaille <demaille@gostai.com>
+
+ TODO: YYPRINT.
+ * TODO (YYPRINT): New.
+
+2008-11-13 Akim Demaille <demaille@gostai.com>
+
+ Comment changes.
+ * data/lalr1.cc, data/yacc.c: Fix the description of the
+ yytranslate and yytoknum tables.
+
+2008-11-13 Akim Demaille <demaille@gostai.com>
+
+ Define make_symbol in the header.
+ To reach good performances these functions should be inlined (yet this is
+ to measure precisely). To this end they must be available to the caller.
+
+ * data/lalr1.cc (b4_symbol_constructor_definition_): Qualify
+ location_type with the class name.
+ Since will now be output in the header, declare "inline".
+ No longer use b4_symbol_constructor_specializations, but
+ b4_symbol_constructor_definitions in the header.
+ Don't call it in the *.cc file.
+
+2008-11-13 Akim Demaille <demaille@gostai.com>
+
+ Define yytranslate in the header for lex_symbol.
+ * data/lalr1.cc: Move the invocation of b4_yytranslate_definition
+ into the header file when using %define lex_symbol.
+ (yytranslate_): Declare inline.
+
+2008-11-13 Akim Demaille <demaille@gostai.com>
+
+ Define the constructors of symbol_type in b4_symbol_constructor_definitions.
+ The constructors are called by the make_symbol functions, which a
+ forthcoming patch will move elsewhere. Hence the interest of putting them
+ together.
+
+ The stack_symbol_type does not need to be moved, it is used only by the
+ parser.
+
+ * data/lalr1.cc: Move symbol_type and symbol_base_type
+ constructors into...
+ (b4_symbol_constructor_definitions): here.
+ Adjust.
+
+2008-11-13 Akim Demaille <demaille@gostai.com>
+
+ Make it easier to move the definition of yytranslate_.
+ Forthcoming changes will make it possible to use yytranslate_
+ from outside the parser implementation file.
+
+ * data/lalr1.cc (b4_yytranslate_definition): New.
+ Use it.
+
+2008-11-13 Akim Demaille <demaille@gostai.com>
+
+ Remove useless class specification.
+ * data/lalr1.cc (b4_symbol_constructor_specialization_): No need
+ to refer to the class name to use a type defined by the class for
+ arguments of member functions.
+
+2008-11-13 Akim Demaille <demaille@gostai.com>
+
+ Finer input type for yytranslate.
+ This patch is debatable: the tradition expects yylex to return an int
+ which happens to correspond to token_number (which is an enum). This
+ allows for instance to return characters (such as '*' etc.). But this
+ goes against the stronger typing I am trying to have with the new
+ lex interface which return a symbol_type. So in this case, feed
+ yytranslate_ with a token_type.
+
+ * data/lalr1.cc (yytranslate_): When in %define lex-symbol,
+ expect a token_type.
+
+2008-11-13 Akim Demaille <demaille@gostai.com>
+
+ Honor lex-params in %define lex_symbol mode.
+ * data/lalr1.cc: Use b4_lex_param.
+
+2008-11-13 Akim Demaille <demaille@gostai.com>
+
+ Simplify names.
+ * src/output.c (symbol_definitions_output): Rename symbol
+ attributes type_name and has_type_name as type and has_type.
+ * data/lalr1.cc: Adjust uses.
+
+2008-11-13 Akim Demaille <demaille@gostai.com>
+
+ Use b4_type_names for the union type.
+ The union used to compute the size of the variant used to iterate over the
+ type of all the symbols, with a lot of redundancy. Now iterate over the
+ lists of symbols having the same type-name.
+
+ * data/lalr1.cc (b4_char_sizeof_): New.
+ (b4_char_sizeof): Use it.
+ Adjust to be called with a list of numbers instead of a single
+ number.
+ Adjust its caller for new-line issues.
+
+2008-11-13 Akim Demaille <demaille@gostai.com>
+
+ Define the "identifier" of a symbol.
+ Symbols may have several string representations, for instance if they
+ have an alias. What I call its "id" is a string that can be used as
+ an identifier. May not exist.
+
+ Currently the symbols which have the "tag_is_id" flag set are those that
+ don't have an alias. Look harder for the id.
+
+ * src/output.c (is_identifier): Move to...
+ * src/symtab.c (is_identifier): here.
+ * src/symtab.h, src/symtab.c (symbol_id_get): New.
+ * src/output.c (symbol_definitions_output): Use it to define "id"
+ and "has_id".
+ Remove the definition of "tag_is_id".
+ * data/lalr1.cc: Use the "id" and "has_id" whereever "tag" and
+ "tag_is_id" were used to produce code.
+ We still use "tag" for documentation.
+
+2008-11-11 Akim Demaille <demaille@gostai.com>
+
+ Locations are no longer required by lalr1.cc.
+ * data/lalr1.cc (_b4_args, b4_args): New.
+ Adjust all uses of locations to make them optional.
+ * tests/c++.at (AT_CHECK_VARIANTS): No longer use the locations.
+ (AT_CHECK_NAMESPACE): Check the use of locations.
+ * tests/calc.at (_AT_DATA_CALC_Y): Adjust to be usable with or
+ without locations with lalr1.cc.
+ Test these cases.
+ * tests/output.at: Check lalr1.cc with and without location
+ support.
+ * tests/regression.at (_AT_DATA_EXPECT2_Y, _AT_DATA_DANCER_Y):
+ Don't use locations.
+
+2008-11-11 Akim Demaille <demaille@gostai.com>
+
+ AT_FULL_COMPILE.
+ * tests/local.at (AT_FULL_COMPILE): New.
+ * tests/actions.at, tests/calc.at, tests/regression.at: Use it.
+
+2008-11-11 Akim Demaille <demaille@gostai.com>
+
+ Support parens in calc++.
+ * doc/bison.texinfo (Calc++ Scanner, Calc++ Parser): Support parens.
+ * examples/calc++/test (run): Check the expected output.
+ Adjust callers.
+ Check parens too.
+
+2008-11-11 Akim Demaille <demaille@gostai.com>
+
+ Simplify lalr1.cc since %defines is mandatory.
+ * data/lalr1.cc: Remove useless calls to b4_defines_if.
+
+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>
+
+ More information about the symbols.
+ * src/output.c (type_names_output): Document all the symbols,
+ including those that don't have a type-name.
+ (symbol_definitions_output): Define "is_token" and
+ "has_type_name".
+ * data/lalr1.cc (b4_type_action_): Skip symbols that have an empty
+ type-name, now that they are defined too in b4_type_names.
+
+2008-11-10 Akim Demaille <demaille@gostai.com>
+
+ Regen.
+
+2008-11-10 Akim Demaille <demaille@gostai.com>
+
+ 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.
+
+2008-11-10 Akim Demaille <demaille@gostai.com>
+
+ Avoid trailing spaces.
+ * data/c.m4: b4_comment(TEXT): Don't indent empty lines.
+ * data/lalr1.cc: Don't indent before rule and symbol actions, as
+ they can be empty, and anyway this incorrectly indents the first
+ action.
+
+2008-11-10 Akim Demaille <demaille@gostai.com>
+
+ Comment changes.
+
+2008-11-10 Akim Demaille <demaille@gostai.com>
+
+ 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...
+ (yytranslate_): here.
+
+2008-11-10 Akim Demaille <demaille@gostai.com>
+
+ Shortcuts in bench directives.
+ * etc/bench.pl.in (parse_dirs): New.
+ Use it.
+ (bench_variant_parser, bench_fusion_parser): Use %s and %d.
+ Create the benches in "benches/".
+
+2008-11-10 Akim Demaille <demaille@gostai.com>
+
+ Formatting changes.
+ * data/lalr1.cc: here.
+
+2008-11-10 Akim Demaille <demaille@gostai.com>
+
+ Adjust verbose message to using emacs.
+ * etc/bench.pl.in: Inform compilation-mode when we change the
+ directory.
+ (generate_grammar_list): Recognize %define "variant" in addition
+ to %define variant.
+
+2008-11-10 Akim Demaille <demaille@gostai.com>
+
+ Classify symbols by type-name.
+ * src/uniqstr.h (UNIQSTR_CMP): New.
+ * src/output.c (symbol_type_name_cmp, symbols_by_type_name)
+ (type_names_output): New.
+ (muscles_output): Use it.
+ * data/lalr1.cc (b4_symbol_action_): Remove.
+ (b4_symbol_case_, b4_type_action_): New.
+ Adjust uses of b4_symbol_action_ to use b4_type_action_.
+
+2008-11-10 Akim Demaille <demaille@gostai.com>
+
+ Change the handling of the symbols in the skeletons.
+ Before we were using tables which lines were the symbols and which
+ columns were things like number, tag, type-name etc. It is was
+ difficult to extend: each time a column was added, all the numbers had
+ to be updated (you asked for colon $2, not for "tag"). Also, it was
+ 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.
+
+ * src/output.c (type_names_output): Remove.
+ (symbol_numbers_output, symbol_definitions_output): New.
+ (muscles_output): Call them.
+ (prepare_symbols): Define b4_symbols_number.
+
+2008-11-10 Akim Demaille <demaille@gostai.com>
+
+ --trace=muscles
+ * src/getargs.h, src/getargs.c (trace_muscle): New.
+ (trace_types, trace_args): Support it.
+ * src/output.c (output_skeleton): Use it.
+
+2008-11-10 Akim Demaille <demaille@gostai.com>
+
+ muscles_output.
+ * src/output.c (muscles_output): New, extracted from...
+ (output_skeleton): here.
+ Adjust.
+
+2008-11-10 Akim Demaille <demaille@gostai.com>
+
+ Formatting changes.
+
+2008-11-10 Akim Demaille <demaille@gostai.com>
+
+ Update the variant example.
+ * examples/variant.yy: Formatting changes.
+ One stage build.
+
2008-11-10 Akim Demaille <demaille@gostai.com>
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.
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
-
+
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.
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.
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.
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.
-
+
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.
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.
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.
-
+
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.
-
+
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
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
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.
-
+
* 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.
-
+
* data/c.m4 (b4_symbol_value): New.
Use it.
* data/c++.m4, data/yacc.c: Use it.