+2008-11-15 Akim Demaille <demaille@gostai.com>
+
+ Support parametric types.
+
+ There are two issues to handle: first scanning nested angle
+ bracket pairs to support types such as std::pair< std::string,
+ std::list<std::string> > >.
+
+ Another issue is to address idiosyncracies of C++: do not glue two
+ closing angle brackets together (otherwise it's operator>>), and
+ avoid sticking blindly a TYPE to the opening <, as it can result
+ in '<:' which is a digraph for '['.
+
+ * src/scan-gram.l (brace_level): Rename as...
+ (nesting): this.
+ (SC_TAG): New.
+ Implement support for complex tags.
+ (tag): Accept
+ , but not <.
+ * data/lalr1.cc (b4_symbol_value, b4_symbol_value_template)
+ (b4_symbol_variant): Leave space around types as parameters.
+ * examples/variant.yy: Use nested template types and leading ::.
+ * src/parse-gram.y (TYPE, TYPE_TAG_ANY, TYPE_TAG_NONE, type.opt):
+ Rename as...
+ (TAG, TAG_ANY, TAG_NONE, tag.opt): these.
+ * tests/c++.at: Test parametric types.
+
+2008-11-15 Akim Demaille <akim@betelgeuse.gostai.ensta.fr>
+
+ Test token.prefix.
+ This is not sufficient, but we test at least that the make_SYMBOL
+ interface is not affected by token.prefix. A more general test
+ will be implemented when the support of token.prefix is generalized
+ to more skeletons.
+
+ * tests/c++.at: One more variant test, using token.prefix.
+
+2008-11-15 Akim Demaille <akim@betelgeuse.gostai.ensta.fr>
+
+ Test the make_TOKEN interface.
+ * tests/c++.at (AT_CHECK_VARIANTS): Require and use locations.
+ Factor the common code in yylex.
+ Use it to test "%define lex_symbol".
+
+2008-11-15 Akim Demaille <akim@betelgeuse.gostai.ensta.fr>
+
+ Formatting change.
+
+2008-11-15 Akim Demaille <akim@betelgeuse.gostai.ensta.fr>
+
+ Simplify code for variants bench marks.
+ * etc/bench.pl.in (&generate_grammar_list): Define and use
+ location_type.
+ Factor the common code in yylex.
+
+2008-11-15 Akim Demaille <demaille@gostai.com>
+
+ Better error message.
+ * bootstrap (find_tool): Fix the error message.
+
+2008-11-15 Akim Demaille <demaille@gostai.com>
+
+ Update variant.yy to newest interface.
+ * examples/variant.yy: Define lex_symbol.
+ Adjust.
+
+2008-11-15 Akim Demaille <demaille@gostai.com>
+
+ Don't use locations in variant.yy.
+ * examples/variant.yy: Adjust to not using locations.
+
+2008-11-15 Akim Demaille <demaille@gostai.com>
+
+ Comment changes.
+ * data/local.mk, etc/local.mk, examples/local.mk: Use Automake
+ comments for the license.
+
+2008-11-15 Akim Demaille <demaille@gostai.com>
+
+ Remove tests/Makefile.am.
+ * tests/Makefile.am: Rename as...
+ * tests/local.mk: this.
+ * Makefile.am, configure.ac: Adjust.
+ * Makefile.am (DISTCLEANFILES): Define.
+ (maintainer-check, maintainer-xml-check, maintainer-push-check):
+ Remove, we no longer need to bounce to the real targets.
+
+2008-11-15 Akim Demaille <demaille@gostai.com>
+
+ Comment changes.
+
+2008-11-15 Akim Demaille <demaille@gostai.com>
+
+ djgpp/local.mk.
+ * Makefile.am (EXTRA_DIST): Move djgpp related part to...
+ * djgpp/local.mk: this new file.
+
+2008-11-15 Akim Demaille <demaille@gostai.com>
+
+ Remove doc/Makefile.am.
+ * doc/Makefile.am: Rename as...
+ * doc/local.mk: this.
+ Adjust paths
+ * Makefile.am, configure.ac: Adjust.
+ * Makefile.am (MOSTLYCLEANFILES): New.
+ * src/local.mk: Adjust.
+
+2008-11-15 Akim Demaille <demaille@gostai.com>
+
+ Move sc_tight_scope into maint.mk.
+ It does not work, and I don't know how it was supposed to work: it
+ seems to be looking for sources in the build tree. I just moved
+ it at a better place, fixing it is still required.
+
+ * src/local.mk (echo): Remove.
+ (sc_tight_scope): Move to...
+ * maint.mk: here.
+
+2008-11-15 Akim Demaille <demaille@gostai.com>
+
+ Regen.
+ * src/parse-gram.h, src/parse-gram.h: Regen.
+
+2008-11-15 Akim Demaille <demaille@gostai.com>
+
+ Remove src/Makefile.am.
+ * src/Makefile.am: Rename as...
+ * src/local.mk: this.
+ Prefix all the paths with src/.
+ (AUTOMAKE_OPTIONS): Build object files in the sub dirs.
+ (AM_CPPFLAGS): Find find in builddir/src.
+ (YACC): Move the flags into...
+ (AM_YFLAGS): here.
+ * maint.mk (sc_tight_scope): Disable.
+ It used to bounce to the version in src/Makefile.am which is now
+ part of this very Makefile.
+ * Makefile.am, configure.ac: Adjust.
+ * src/scan-code-c.c, src/scan-code.l: We can no longer rely on
+ include "..." to find files "here": we are no longer in src/, so
+ qualify the includes with src/.
+ * doc/Makefile.am (PREPATH): No longer include the top_builddir
+ prefix.
+ (.x.1): Adjust to be able to create src/foo from the top level
+ Makefile, instead of going bounce to src/Makefile the creation of
+ foo.
+
+2008-11-15 Akim Demaille <demaille@gostai.com>
+
+ Remove useless variable.
+ * doc/Makefile.am (srcsrcdir): Remove.
+
+2008-11-15 Akim Demaille <demaille@gostai.com>
+
+ Remove data/Makefile.am.
+ * data/Makefile.am: Rename as...
+ * data/local.mk: this.
+ Adjust paths.
+ * Makefile.am, configure.ac: Adjust.
+
+2008-11-15 Akim Demaille <demaille@gostai.com>
+
+ Remove etc/Makefile.am.
+ * etc/Makefile.am: Rename as...
+ * etc/local.mk: this.
+ Adjust.
+ * Makefile.am, configure.ac: Adjust.
+
+2008-11-15 Akim Demaille <demaille@gostai.com>
+
+ Remove examples/local.mk.
+ examples/calc++/Makefile.am might be interesting to keep as is, since
+ it is an example in itself.
+
+ * examples/Makefile.am: Rename as...
+ * examples/local.mk: this.
+ Adjust.
+ * Makefile.am, configure.ac: Adjust.
+
+2008-11-15 Akim Demaille <demaille@gostai.com>
+
+ Remove build-aux/Makefile.am.
+ Recursive Makefiles are really way too slow, let's get rid of some of
+ them.
+
+ * build-aux/Makefile.am: Rename as...
+ * build-aux/local.mk: this.
+ Adjust paths.
+ * Makefile.am, configure.ac: Adjust.
+
+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 allows the user to get the type of a token returned 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.
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.
-
+ 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".
2008-11-13 Akim Demaille <demaille@gostai.com>
- Define the constructors of symbol_type in b4_symbol_constructor_definitions.
+ 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.
-
+ 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.
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.
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>
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.
-
+ 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
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.
-
+ 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.
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.
-
+ 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_)
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.
+ 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-09 Akim Demaille <demaille@gostai.com>
Rely on the state stack to display reduction traces.
- 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.
2008-11-03 Akim Demaille <demaille@gostai.com>
Fuse the three stacks into a single one.
- 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.
+ 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.
- 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).
+ 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
These changes should probably benefit the C parser too.
- * data/lalr1.cc: Copy as... * data/lalr1-fusion.cc: this new
- file.
+ * data/lalr1.cc: Copy as...
+ * data/lalr1-fusion.cc: this new file.
(b4_rhs_value, b4_rhs_location): New definitions overriding those
from c++.m4.
(state_stack_type, semantic_stack_type, location_stack_type)
2008-11-03 Akim Demaille <demaille@gostai.com>
Use variants to support objects as semantic values.
- This patch was inspired by work by Michiel De Wilde. But he used Boost
- 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 patch was inspired by work by Michiel De Wilde. But he used
+ Boost 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.