From: Akim Demaille Date: Sat, 15 Nov 2008 13:41:58 +0000 (+0100) Subject: Fixes. X-Git-Tag: v2.7.90~1024 X-Git-Url: https://git.saurik.com/bison.git/commitdiff_plain/b06df3c2c7e58cf8790d8f92905b8d217db992c2 Fixes. --- diff --git a/ChangeLog b/ChangeLog index 4543fdd4..fea59045 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,19 +1,21 @@ 2008-11-15 Akim Demaille 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 > >. - - 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 '['. - + + There are two issues to handle: first scanning nested angle + bracket pairs to support types such as std::pair< std::string, + std::list > >. + + 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 + (tag): Accept , but not <. * data/lalr1.cc (b4_symbol_value, b4_symbol_value_template) (b4_symbol_variant): Leave space around types as parameters. @@ -30,7 +32,7 @@ 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 @@ -106,10 +108,10 @@ 2008-11-15 Akim Demaille 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. - + 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. @@ -195,7 +197,8 @@ 2008-11-15 Akim Demaille - Instead of using make_symbol, generate make_FOO for each token type. + Instead of using make_symbol, 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. @@ -218,10 +221,10 @@ 2008-11-13 Akim Demaille %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. + 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. @@ -236,8 +239,7 @@ 2008-11-13 Akim Demaille symbol::token. - This is allows the user to get the type of a token return by - yylex. + 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 @@ -267,8 +269,9 @@ 2008-11-13 Akim Demaille 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. @@ -286,13 +289,14 @@ 2008-11-13 Akim Demaille - 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. + 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. + 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... @@ -343,9 +347,9 @@ 2008-11-13 Akim Demaille 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. @@ -356,12 +360,12 @@ 2008-11-13 Akim Demaille 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. + 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. + 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. @@ -501,13 +505,13 @@ 2008-11-11 Akim Demaille 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) @@ -660,8 +664,8 @@ 2008-11-10 Akim Demaille 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. @@ -921,9 +925,10 @@ 2008-11-09 Akim Demaille 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. @@ -1348,18 +1353,22 @@ 2008-11-03 Akim Demaille 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 @@ -1367,8 +1376,8 @@ 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) @@ -1411,14 +1420,15 @@ 2008-11-03 Akim Demaille 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.