]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | [/============================================================================== |
2 | Copyright (C) 2001-2011 Joel de Guzman | |
3 | Copyright (C) 2001-2012 Hartmut Kaiser | |
4 | ||
5 | Distributed under the Boost Software License, Version 1.0. (See accompanying | |
6 | file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) | |
7 | ===============================================================================/] | |
8 | ||
9 | [section What's New] | |
10 | ||
11 | [/////////////////////////////////////////////////////////////////////////////] | |
12 | [section:spirit_2_5_3 Spirit V2.5.3] | |
13 | ||
14 | [heading What's changed from V2.5.2 (Boost V1.49.0) to V2.5.3 (Boost V1.50.0)] | |
15 | ||
16 | * The deprecated headers are removed. It's been there for a couple of years now | |
17 | and it's about time to do some cleanup. | |
18 | ||
19 | [endsect] | |
20 | ||
21 | [/////////////////////////////////////////////////////////////////////////////] | |
22 | [section:spirit_2_5_2 Spirit V2.5.2] | |
23 | ||
24 | [heading What's changed from V2.5.1 (Boost V1.48.0) to V2.5.2 (Boost V1.49.0)] | |
25 | ||
26 | * Integrated Vitaly Budovski's patch to add binary floating point parsers and | |
27 | generators. | |
28 | * Fixed #6253: `lex::lexertl::generate_static_dfa` compiler errors if lexer has | |
29 | wchar_t as underlying stream type. | |
30 | * Added the possibility to match a token range when parsing with a lexer by | |
31 | using `qi::token(min, max)`, or `qi::tokenid(min, max)`. Both parsers match | |
32 | any token with a token id in the range [min, max]. | |
33 | * Fixed a problem in [karma_align `center`]`(num)[a]` and | |
34 | [karma_align `center`]`(num, g)[a]` if used inside a compound generator (such | |
35 | as sequences, Kleene, list, or plus. | |
36 | * Fixed `karma::subrule` from the [@../../repository/doc/html/index.html repository] | |
37 | (thanks to Lee Clagett for submitting a patch). | |
38 | * Fixed __karma__ examples (thanks to Lee Clagett for submitting a patch). | |
39 | * Fixed #6368: [multi_pass] clear_queue isn't forwarded to the storage policy. | |
40 | * Fixed a problem in __karma__ when a variant holding a container was used as | |
41 | a generator inside a sequence. | |
42 | ||
43 | [endsect] | |
44 | ||
45 | [/////////////////////////////////////////////////////////////////////////////] | |
46 | [section:spirit_2_5_1 Spirit V2.5.1] | |
47 | ||
48 | [heading What's changed from V2.5 (Boost V1.47.0) to V2.5.1 (Boost V1.48.0)] | |
49 | ||
50 | * The `spirit::istream_iterator` (see __multi_pass__) now checks at | |
51 | construction time whether the underlying stream has reached eof (end of file). | |
52 | * __qi__ now properly collapses attributes generated from optionals embedded | |
53 | inside another optional parser (i.e. `-('(' > -int_ >> ')'). That means that | |
54 | attributes like `boost::optional<boost::optional<int> >` will be collapsed | |
55 | to `boost::optional<int>`. Thanks to Peter Schueller for reporting that | |
56 | problem. | |
57 | * Actions attached to binary parsers now properly propagate the parser's | |
58 | attribute. Thanks to Mathias Born for reporting this issue. | |
59 | ||
60 | [heading Bug Fixes in Lex] | |
61 | ||
62 | * Fixed Boost ticket #5701: lexertl token_value_type returns const unused for | |
63 | nonconst ref. | |
64 | * Fixed a problem in the lexer (position_token) causing problems with enabled | |
65 | parser debugging (MSVC2010). | |
66 | ||
67 | [endsect] | |
68 | ||
69 | [/////////////////////////////////////////////////////////////////////////////] | |
70 | [section:spirit_2_5 Spirit V2.5] | |
71 | ||
72 | [heading What's changed in __qi__ and __karma__ from V2.4.2 (Boost V1.46.0) to V2.5 (Boost V1.47.0)] | |
73 | ||
74 | This version of __spirit__ now supports the new version of __boost_phoenix__ (V3), | |
75 | which has been released as part of Boost V1.47. Please note that this support | |
76 | is purely preliminary and should not be considered production quality. The | |
77 | reason why we are releasing this now is to enable people who want to use the | |
78 | new version of __boost_phoenix__ in their code to do so without any conflicts with | |
79 | existing code using __spirit__. Generally, no __spirit__ code needs to be | |
80 | changed. To activate the use of __boost_phoenix__ V3 for __spirit__ you need to | |
81 | define the following preprocessor constant for your builds (before including | |
82 | any of Spirit's include files): | |
83 | ||
84 | #define BOOST_SPIRIT_USE_PHOENIX_V3 1 | |
85 | ||
86 | [heading New Features in Qi or Karma] | |
87 | ||
88 | * Added __utree__, a generic, hierarchical, and dynamic data structure that can | |
89 | represent abstract syntax trees. It's well integrated with __qi__ and | |
90 | __karma__. It can be passed as an attribute while parsing to almost any | |
91 | grammar. At the same time, it can be used as an attribute to generate output | |
92 | from. | |
93 | * Added a new macro `BOOST_SPIRIT_TERMINAL_NAME` which takes in two parameters | |
94 | (the terminal name and its type). Before, there was only one parameter | |
95 | (the terminal name) and the type assumed the terminal name with `_type` | |
96 | appended. This produced invalid C++ identifiers with terminals such as | |
97 | `int_`, which resulted in generated a type `int__type` with a bogus double | |
98 | underscore that is reserved for system use in C++. | |
99 | * The numeric parsers now allow arbitrary radix from 2..10 and 16 | |
100 | * The placeholder `_val` now can be used in top level semantic actions outside | |
101 | of any right hand side of a rule. Here is an example: | |
102 | `` | |
103 | int i = 0 | |
104 | BOOST_TEST(test_attr("456", int_[_val = _1], i) && i == 456); | |
105 | `` | |
106 | In this case _val refers to the attribute value, which is passed in to the | |
107 | `parse()` or `phrase_parse()` functions. | |
108 | Similar constructs are now possible in __karma__ as well: | |
109 | `` | |
110 | int i = 123; | |
111 | BOOST_TEST(test("123", int_[_1 = _val], i)); | |
112 | `` | |
113 | This change unifies the handling of the `_val` placeholder allowing to use it | |
114 | everywhere, not only in semantic actions attached to the right hand sides of | |
115 | a rule. | |
116 | * Added support for __karma__ [unsigned_int unsigned numeric generators] with | |
117 | arbitrary radix values in the (inclusive) range from `2` .. `36`. | |
118 | ||
119 | [heading Bug Fixes in Qi or Karma] | |
120 | ||
121 | * __qi__ integer literals (like `int_(10)`) do not consume input on failure | |
122 | anymore. | |
123 | * Fixed Boost ticket #5246: mmap_file_iterator Fails to initialize correctly. | |
124 | * Fixed Boost ticket #5246: mmap_file_iterator Fails to initialize correctly. | |
125 | * Fixed a const correctness problem in `karma::real_policies<>` preventing the | |
126 | use of const floating point types with the generator. Thanks to Jeroen | |
127 | Habraken (a.k.a. VeXocide) for reporting it and for submitting a patch and | |
128 | a test. | |
129 | * Fixed the __qi__ __qi_attr__ parser, the __qi__ __qi_symbols__ parser, and | |
130 | the __karma__ [karma_symbols `symbols<>`] generator to properly handle | |
131 | container attributes. These were broken in Boost V1.46.1 (thanks to | |
132 | Aaron Graham and Joerg Becker for reporting the problems). | |
133 | * Fixed the __qi_stream__ parser to properly adjust the iterator of the | |
134 | underlying input stream in the case when the stream parser component was | |
135 | successful. Thanks to Brian O'Kennedy who reported the problem on | |
136 | Stackoverflow. | |
137 | * Fixed failing Karma numerics generators when used with adapted ADTs (thanks | |
138 | to Colin Rundel for reporting that problem). | |
139 | ||
140 | [heading Breaking Changes] | |
141 | ||
142 | * The __qi__ directive __qi_repeat__ erroneously implemented commit/rollback | |
143 | semantics for its attribute, leaving it untouched if the directive failed. | |
144 | This behaviour has been removed as it is inconsistent with similar components. | |
145 | Existing code relying on this functionality will break. Please refer to the | |
146 | __qi__ directive __qi_hold__ to see how to fix your code. | |
147 | * Added a preprocessor define `BOOST_SPIRIT_NO_PREDEFINED_TERMINALS` to prevent | |
148 | instantiations of predefined terminal objects which slows down compile time | |
149 | a lot. When `BOOST_SPIRIT_NO_PREDEFINED_TERMINALS` is defined, the user | |
150 | instantiates the terminals that he needs. So, instead of writing `using qi::uint_` | |
151 | one writes instead: `qi::uint_type uint_`. | |
152 | ||
153 | [heading New Features in Lex] | |
154 | ||
155 | * Added the possibility to specify a token id while creating a token definition | |
156 | using `lex::char_` and `lex::string`. Both primitives now accept a second | |
157 | parameter which will be interpreted as the requested token id for any token | |
158 | generated from this definition. | |
159 | * Added a new token type `lex::lexertl::position_token<>`, which is essentially | |
160 | plup-in compatible with the existing `lex::lexertl::token<>` class. However | |
161 | it additionally stores the pair of iterators pointing to the underlying | |
162 | matched input sequence as an iterator_range. | |
163 | ||
164 | [heading Bug Fixes in Lex] | |
165 | ||
166 | * Fixed a problem with associating token definitions with all states (using | |
167 | `"*"` as the state name) when actions were attached to them. | |
168 | ||
169 | [heading Making Stuff Work] | |
170 | ||
171 | * Added the __karma__ customization point __customize_extract_from_container__, | |
172 | which will be invoked instead of the older customization point | |
173 | __customize_extract_from__ if the attribute is a container (__customize_is_container__ | |
174 | returns `true` for the attribute). | |
175 | * The type `hold_any` now takes a template argument: `basic_hold_any<Char>`, | |
176 | where `Char` is the character type used for the streaming operators | |
177 | (`operator>>()` and `operator<<()`). The `hold_any` is still available as a | |
178 | `typedef basic_hold_any<char> hold_any`; | |
179 | * Semantic actions now support attribute compatibility. This is a breaking | |
180 | change but #define BOOST_SPIRIT_ACTIONS_ALLOW_ATTR_COMPAT must be defined | |
181 | in order for the new behavior to kick in. By default, the old behavior | |
182 | is still in place. | |
183 | * Alternatives now support attribute compatibility. | |
184 | * The attribute handling for container attributes of sequences and container | |
185 | components (list, Kleene, Plus, and repeat) has been completely rewritten. | |
186 | It now supports many more use cases and behaves much more predictable than | |
187 | the older version. Thanks to Thomas Taylor, Richard Crossley, Semen, | |
188 | Adalberto Castelo, and many others for reporting bugs and helping in making | |
189 | the new code behave as expected. | |
190 | ||
191 | [endsect] | |
192 | ||
193 | [/////////////////////////////////////////////////////////////////////////////] | |
194 | [section:spirit_2_4_2 Spirit V2.4.2] | |
195 | ||
196 | [heading What's changed in __qi__ and __karma__ from V2.4.1 (Boost V1.45.0) to V2.4.2 (Boost V1.46.0)] | |
197 | ||
198 | [heading New Features in Qi or Karma] | |
199 | ||
200 | * Added keyword indexes for __qi__ and __karma__ to the docs. | |
201 | * Introduced a new customization point __customize_assign_to_container_from_value__ | |
202 | which is invoked for container attributes whenever an attribute value needs to | |
203 | be added to that container. | |
204 | * Replaced `proto::lit` (which was used to implement `spirit::lit`) with a | |
205 | separate version allowing to distinguish 'lit(foo)' from 'foo'. This should | |
206 | not change any semantics nor should it break exiting code. | |
207 | * Added the __qi__ directive __qi_as__ (and its string specializations | |
208 | __qi_as_string__ and __qi_as_wstring__) enabling asignment of container | |
209 | attribute types as a whole. | |
210 | * Added the __karma__ directive __karma_as__ (and its string specializations | |
211 | __karma_as_string__ and __karma_as_wstring__) enabling handling of container | |
212 | attribute types during output generation as a whole. | |
213 | * In __qi__, `lit()` can now be used for numeric literals as well. | |
214 | * The __qi_symbols__ parser component now has an explicit name used for | |
215 | error handling and debugging, which can be set using the new member functions | |
216 | `sym.name(...)`. Thanks to teajay for contributing a patch. | |
217 | * The [karma_symbols `symbols<Attrib, T>`] generator component now has an | |
218 | explicit name used for error handling and debugging, which can be set using | |
219 | the new member functions `sym.name(...)`. | |
220 | ||
221 | [heading Bug Fixes in Qi or Karma] | |
222 | ||
223 | * Fixed a problem in handling container attributes for __qi__ sequences, which | |
224 | caused the properly parsed attributes of the first elements being overwritten | |
225 | by later elements of the sequence. | |
226 | * Fixed the __karma__ generator [karma_string `string(s)`]. It succeeded even | |
227 | if `s` matched only a prefix of its attribute. | |
228 | ||
229 | [heading What's changed in __lex__ from V2.4.1 (Boost V1.45.0) to V2.4.2 (Boost V1.46.0)] | |
230 | ||
231 | [heading New Features in Lex] | |
232 | ||
233 | * Added `qi::tokenid()` primitive parser allowing to match arbitrary lexer | |
234 | tokens based on a given token id. The difference to `qi::token()` is, that it | |
235 | exposes as its attribute the token id of the matched token (instead of the | |
236 | iterator_range of the matched input, as `qi::token()` does). | |
237 | * Added an additional template parameter to the default `lexertl::token<>` | |
238 | definition: the type of the token id. This type defaults to `std::size_t`. | |
239 | Any type used as the id type needs to be (explicitly) convertible from | |
240 | `std::size_t`. | |
241 | * It's now possible to attach lexer semantic actions to token definitions | |
242 | based on `lex::char()` and `lex::string()`. | |
243 | * It's now possible to specify a lexer state the lexer should automatically be | |
244 | switched to after matching certain tokens. For this reason the token | |
245 | definition syntax has been extended: | |
246 | `` | |
247 | template <typename Lexer> | |
248 | struct lexer : lex::lexer<Lexer> | |
249 | { | |
250 | lexer() | |
251 | { | |
252 | int_ = "[1-9][0-9]*"; | |
253 | this->self("INITIAL", "TARGETSTATE") = int_; | |
254 | } | |
255 | lex::token_def<int> int_; | |
256 | }; | |
257 | `` | |
258 | This example lexer will match a `int_` token and will switch the lexer to | |
259 | the state `"TARGETSTATE"` afterwards. If the second argument is not | |
260 | specified the lexer remains in the previous state (as before). | |
261 | * The parser primitives `qi::token` and `qi::tokenid` can now be used without | |
262 | any argument. In this case they will match any token. | |
263 | * `lex::lit()` has been removed. | |
264 | ||
265 | [heading Bug Fixes in Lex] | |
266 | ||
267 | * Fixed an issue in the Lexer giving problems while assigning tokens to all | |
268 | lexer states at once. This is now possible by simply using "*" as the state | |
269 | name. For instance this will add the token int_ to all lexer states: | |
270 | `` | |
271 | template <typename Lexer> | |
272 | struct lexer : lex::lexer<Lexer> | |
273 | { | |
274 | lexer() | |
275 | { | |
276 | int_ = "[1-9][0-9]*"; | |
277 | this->self("*") = int_; | |
278 | } | |
279 | lex::token_def<int> int_; | |
280 | }; | |
281 | `` | |
282 | Note: the `self("*") = ...` must be executed after all lexer states have | |
283 | been introduced to the lexer object. | |
284 | ||
285 | * Fixed lexer lookahead. The lookahead operation is now evaluated using the | |
286 | lexer state the `token_def` instance used as its argument is associated | |
287 | with. | |
288 | * Fixed a problem in the `multi_pass` iterator causing wrong tokens to be | |
289 | returned to the user. This could happen in conjunction with a lexer which | |
290 | performed lexer state changes and was using `pass_fail` in semantic actions | |
291 | to make a token match fail. | |
292 | ||
293 | [heading Known Problems] | |
294 | ||
295 | * __qi__ integer literals (like `int_(10)`) consume input on failure, which can | |
296 | lead to problems with the alternative operator. | |
297 | ||
298 | [endsect] | |
299 | ||
300 | [/ spirit_2_4_2] | |
301 | ||
302 | [/////////////////////////////////////////////////////////////////////////////] | |
303 | [section:spirit_2_4_1 Spirit V2.4.1] | |
304 | ||
305 | [heading What's changed in __qi__ and __karma__ from V2.4 (Boost V1.44.0) to V2.4.1 (Boost V1.45.0)] | |
306 | ||
307 | [heading Bug Fixes] | |
308 | ||
309 | * Fixed broken __qi__ debugging facilities for optional attributes. | |
310 | * The __qi__ auto parsers and __karma__ auto generators will now properly work | |
311 | with `signed char` and `unsigned char` as well. | |
312 | * Fixed a problem in the multi_pass fixed_queue policy. | |
313 | * Enabled proper modifier handling for the __qi_skip__ directive. | |
314 | * Fixed a floating point formating problem in Karma (Trac ticket #4742). | |
315 | * Fixed a problem in [qi_repeat `repeat`]`[]`, which caused the `first` | |
316 | iterator not to be reset on certain parsing failures (see | |
317 | [@http://stackoverflow.com/questions/4009752/boost-spirit-bug-when-mixing-alternates-with-optionals Stack Overflow]). | |
318 | ||
319 | [endsect] [/ spirit_2_4_1] | |
320 | ||
321 | [/////////////////////////////////////////////////////////////////////////////] | |
322 | [section:spirit_2_4 Spirit V2.4] | |
323 | ||
324 | [heading What's changed in __qi__ and __karma__ from V2.3 (Boost V1.43.0) to V2.4 (Boost V1.44.0)] | |
325 | ||
326 | [heading New Features] | |
327 | ||
328 | * The customization point __customize_transform_attribute__ now takes an additional template | |
329 | parameter `Domain` allowing to better specialize the customization point | |
330 | for either `qi::domain` or `karma::domain`. | |
331 | ||
332 | [important This is a interface breaking change requiring to modify existing | |
333 | code. If you have a specialization of this customization point in | |
334 | your code you need to add the specialization for the new template | |
335 | parameter, i.e. either `qi::domain` or `karma::domain`.] | |
336 | * Semantic actions in __qi__ now implicitly invoke the function `pre` of the | |
337 | customization point __customize_transform_attribute__ to convert the supplied | |
338 | attribute to the exposed attribute type, as needed. The functions | |
339 | `post` and `fail` of this customization point are not invoked by this | |
340 | component (as this would not make any sense). | |
341 | * Semantic actions in __karma__ now implicitly invoke the function `pre` of the | |
342 | customization point __customize_transform_attribute__ to convert the supplied | |
343 | attribute to the consumed attribute type, as needed. | |
344 | * Added the __karma__ __karma_skip__ directive which is semantically equivalent | |
345 | to the __karma__ __karma_omit__ directive except that it will not execute the | |
346 | embedded generator. | |
347 | * Added debug support to __karma__ rules. | |
348 | * Added strict mode to __karma__, leaving the current behavior (unchanged) as | |
349 | relaxed mode. Added __karma__ compile time directives `strict[]` and | |
350 | `relaxed[]` allowing to switch between the two. | |
351 | * Added __karma__ __karma_duplicate__ directive which duplicates the supplied | |
352 | attribute to all elements of an embedded generator sequence. | |
353 | ||
354 | [heading Bug Fixes] | |
355 | ||
356 | * Components in __qi__ and __karma__ now accept one element Fusion sequences as | |
357 | their attributes as long as the element in the Fusion sequence is compatible | |
358 | with the component's attribute type. | |
359 | * The character range parser and generator components can now additionally be | |
360 | written as `char_("a", "z")` instead of `char_('a', 'z')` making it | |
361 | consistent with the syntax of the `char_('a')` component (which can be | |
362 | written as `char_("a")` as well). Please note that the mixed syntax forms, | |
363 | i.e. `char_('a', "z")` and `char_("a", 'z')`, are not supported. | |
364 | * Fixed attribute handling in __karma__ sequences when all elements of that | |
365 | sequence consume either the same attribute type or containers of that | |
366 | attribute type and the passed in attribute is a container of that attribute | |
367 | type as well. In this case using a repetitive container was supported only | |
368 | when it was the last element of the sequence. Now it is possible to | |
369 | have a [karma_repeat `repeat`]`(num)[a]` generator at any position (well, | |
370 | actually you can have any repetitive container at any position now, but this | |
371 | doesn't always make sense as it normally would eat up all supplied attribute | |
372 | values). | |
373 | * Fixed debug output for variants where a variant element is an STL sequence. | |
374 | * Fixed a problem in multi_pass, avoiding to loose a character at end of input | |
375 | when switching iterators. | |
376 | ||
377 | [heading What's changed in __lex__ from V2.3 (Boost V1.43.0) to V2.4 (Boost V1.44.0)] | |
378 | ||
379 | [heading New Lexer Features] | |
380 | ||
381 | * The lexer is now well integrated with the debug output generated by Qi's | |
382 | simple_trace utility. Tokens are printed as: '<' matched sequence '>'. | |
383 | ||
384 | [heading Lexer Bug Fixes] | |
385 | ||
386 | * Fixed a problem with using lex::_val as a rvalue in lexer semantic | |
387 | expressions. | |
388 | * Token values are now available for introspection (as an iterator_range) | |
389 | inside lexer semantic expressions as well. | |
390 | ||
391 | [endsect] [/ spirit_2_4] | |
392 | ||
393 | [/////////////////////////////////////////////////////////////////////////////] | |
394 | [section:spirit_2_3 Spirit V2.3] | |
395 | ||
396 | [heading What's changed in __qi__ and __karma__ from V2.2 (Boost V1.42.0) to V2.3 (Boost V1.43.0)] | |
397 | ||
398 | [heading New Features] | |
399 | ||
400 | * The customization point `transform_attribute` now has to implement a third | |
401 | function: `void fail(Exposed&)`, which normally will do nothing. This function | |
402 | will be called whenever the right hand side of the `rule` (or the embedded | |
403 | parser of `attr_cast`) fail parsing. This change affects /Qi/ only. See | |
404 | the description of the __customize_transform_attribute__ for more details. | |
405 | * Added support for attribute sequences created with `BOOST_FUSION_ADAPT_CLASS` | |
406 | and `BOOST_FUSION_ADAPT_CLASS_NAMED`. This support requires to include the | |
407 | new header file: `#include <boost/spirit/inlcude/support_adapt_class_attributes.hpp>`. | |
408 | * Added `karma::ostream_iterator` as a counterpart to `qi::istream_iterator` | |
409 | (see new header file: `#include <boost/spirit/home/support/iterators/ostream_iterator.hpp>`). | |
410 | * Added `qi::hold` allowing to make sure the embedded parser does not touch | |
411 | the passed attribute in case it fails parsing. | |
412 | * Added [qi_no_skip `qi::no_skip`] directive, which is equivalent to | |
413 | `qi::`__qi_lexeme__, except that it does not pre-skip. | |
414 | * Added [karma_no_delimit `karma::no_delimit`] directive, which is equivalent to | |
415 | `karma::`__karma_verbatim__, except that it does not perform a post-delimiting | |
416 | step. | |
417 | * Added a new input_iterator policy for the `multi_pass` iterator framework | |
418 | (named `buffering_input_iterator`) allowing to wrap underlying input | |
419 | iterators which do not store the last character read from the input (such as | |
420 | `std::istream_iterator`). This is now used as the default input policy. | |
421 | ||
422 | [heading Bug Fixes] | |
423 | ||
424 | * Sequences (in /Qi/ and /Karma/) may now have a component having no attribute | |
425 | even as their last element. | |
426 | * Sequences (in /Qi/ and /Karma/) can now take one element attribute sequences | |
427 | as their attribute. | |
428 | * Constructs like `karma::buffer[karma::buffer[...]]` don't result in | |
429 | performing double buffering anymore. The same is true if an alternative is | |
430 | wrapped into a `karma::buffer[]` directive (as for instance: `buffer[a] | b`). | |
431 | * The __karma__ output iterator (which is used internally, but also is exposed | |
432 | when using the stream based API) is now properly copyable (thanks to Jonas | |
433 | Persson for reporting this issue). | |
434 | * The default `multi_pass` iterator is now usable with underlying input | |
435 | iterators which do not store the last character read from the input (such as | |
436 | `std::istream_iterator`). Thanks to Larry Evans and Peter Schueller for | |
437 | independently reporting this problem. | |
438 | * The directive `karma::omit[]` now does not accept an arbitrary attribute | |
439 | type anymore. | |
440 | * The __karma__ predicates (the and-predicate and the not-predicate) and the | |
441 | directive `karma::omit[]` now disable output altogether instead of | |
442 | intercepting the output into a buffer which got discarded as before. | |
443 | * Fixed `karma::rule` to properly handles optional attributes. | |
444 | ||
445 | [heading What's changed in __lex__ from V2.2 (Boost V1.42.0) to V2.3 (Boost V1.43.0)] | |
446 | ||
447 | [heading New Lexer Features] | |
448 | ||
449 | * The library does not minimize the generated lexer tables for dynamic lexers by | |
450 | default anymore. The generated tables will now be minimized for static lexers | |
451 | only. | |
452 | * The function `lexer<>::init_dfa()` now takes a single boolean parameter | |
453 | (which defaults to `false`) allowing to force minimization of the generated | |
454 | lexer tables. | |
455 | ||
456 | [endsect] [/ spirit_2_3] | |
457 | ||
458 | [//////////////////////////////////////////////////////////////////////////////] | |
459 | [section:spirit_2_2 Spirit V2.2] | |
460 | ||
461 | [heading What's changed in __qi__ and __karma__ from V2.1 (Boost V1.41.0) to V2.2 (Boost V1.42.0)] | |
462 | ||
463 | [heading New Features] | |
464 | ||
465 | * Added `auto_` component in __qi__ and __karma__, added API functions | |
466 | `qi::`__create_parser__ and `karma::`__create_generator__. | |
467 | * Added `auto_` based overloads for all API functions taking no attributes (see | |
468 | [link spirit.qi.reference.parse_api /Qi/ API] and | |
469 | [link spirit.karma.reference.generate_api /Karma/ API]). | |
470 | * Added [karma_columns `karma::columns`] directive. | |
471 | * Added [karma_symbols `karma::symbols<Attr, T>`] generator. | |
472 | * The __qi__ customization point __customize_push_back_container__ now returns | |
473 | a `bool` to report whether the item has been added to the container. | |
474 | * Added an overload for [karma_maxwidth `karma::maxwidth`] directive allowing | |
475 | to specify an additional parameter (any compatible output iterator) receiving | |
476 | the 'overspilled' output (output not fitting into the maxwidth limit). | |
477 | * It is now possible to use Phoenix expressions as __karma__ attributes. | |
478 | * Added [link spirit.support.multi_pass.reading_from_standard_input_streams `basic_istream_iterator<Char, Traits>`] | |
479 | usable as an equivalent for `std::istream_iterator` except its a __fwditer__ | |
480 | allowing to parse directly from any `std::basic_istream`. | |
481 | * Added `qi::`__qi_matches__ directive. | |
482 | ||
483 | [heading Bug Fixes] | |
484 | ||
485 | * Fixed karma::alternatives to work with embedded containers of hold_any (i.e. | |
486 | constructs like `*stream | "empty"` (which fixes the Karma example | |
487 | basic_facilities.cpp). | |
488 | * Fixed numeric __karma__ generators for character types. | |
489 | * Fixed `qi::repeat[]` for unused attributes. | |
490 | * Fixed rare compilation problem in `karma::repeat[]`. | |
491 | * Fixed sequences in __qi__ and __karma__ to compile properly if the attribute | |
492 | is a (STL) container of (STL) containers. | |
493 | * Fixed a problem in `lex::token_def::what`. | |
494 | * Fixed __qi__ symbols not to match substrings anymore. Added | |
495 | `qi::symbols::prefix_find` to allow matching of (prefix-) substrings. | |
496 | * Inherited parameters for rule's usually have to be wrapped in function | |
497 | objects (i.e. `phoenix::val`), for integral values this was not necessary. | |
498 | Now all string types can be passed without being wrapped as well (i.e. | |
499 | `std::string`, `char const*`, etc.). | |
500 | * Added concept checks to all relevant __qi__ API functions enforcing the | |
501 | iterator to be at least of the type `std::forward_iterator_tag`. | |
502 | * Fixed the `qi::match` and `qi::phrase_match` set of API functions not to | |
503 | internally utilize a `std::stream_iterator` anymore as this iterator is of | |
504 | the type `std::input_iterator_tag` only, which is not sufficient for __qi__. | |
505 | ||
506 | [endsect] [/ spirit_2_2] | |
507 | ||
508 | [//////////////////////////////////////////////////////////////////////////////] | |
509 | [section:spirit_2_1 Spirit V2.1] | |
510 | ||
511 | [heading What's changed in __qi__ and __karma__ from V2.0 (Boost V1.37.0) to V2.1 (Boost V1.41.0)] | |
512 | ||
513 | * __spirit__ is now based on the newest version of __boost_proto__ | |
514 | * `qi::phrase_parse`, `qi::phrase_format` now post-skip by default. | |
515 | * `karma::generate_delimited` and `karma::format_delimited` now don't do pre- | |
516 | delimiting by default. | |
517 | * Changed parameter sequence of `qi::phrase_parse`, `qi::phrase_match`, | |
518 | `karma::generate_delimited`, and `match_delimited`. The attribute is now | |
519 | always the last parameter. | |
520 | * Added new overloads of those functions allowing to explicitly specify the | |
521 | post-skipping and pre-delimiting behavior. | |
522 | * Added multi attribute API functions | |
523 | * Removed `grammar_def<>` | |
524 | * Removed functions `make_parser()` and `make_generator()` | |
525 | * Removed `qi::none` and `karma::none` | |
526 | * Sequences and lists now accept a standard container as their attribute | |
527 | * The string placeholder terminal now can take other strings as its parameter | |
528 | (i.e. std::string) | |
529 | * All terminals taking literals now accept a (lazy) function object as well | |
530 | * All placeholders for terminals and directives (such as `int_`, `double_`, | |
531 | `verbatim`, etc.) were previously defined in the namespace `boost::spirit` | |
532 | only. Now these are additionally imported into the namespaces | |
533 | `spirit::qi`, `spirit::karma`, and `spirit::lex` (if they are supported by | |
534 | the corresponding sub-library). | |
535 | * The terminal placeholders `char_` and `string` are not defined in the | |
536 | namespace `boost::spirit` anymore as they have been moved to the | |
537 | character set namespaces, allowing to do proper character set | |
538 | handling based on the used namespace (as `spirit::ascii`, etc.) | |
539 | * The `uint`, `ushort`, `ulong`, and `byte` terminal placeholders have been | |
540 | renamed to `uint_`, `ushort_`, `ulong_`, and `byte_`. | |
541 | * `qi::skip[]` now re-enables outer skipper if used inside `lexeme[]` | |
542 | * Added `karma::maxwidth[]` directive (see [karma_maxwidth `maxwidth`]) | |
543 | * Added `karma::omit[]` allowing to consume the attribute of subject generator | |
544 | without emitting any output (see __karma_omit__). | |
545 | * Added `karma::buffer[]` allowing to avoid unwanted output to be generated in | |
546 | case of a generator failing in the middle of a sequence (see __karma_buffer__). | |
547 | * `karma::delimit[]` now re-enables outer delimiter if used inside `verbatim[]` | |
548 | * Karma: added and-predicate (`operator&()`) and not-predicate (`operator!()`) | |
549 | Both now always consume an attribute. | |
550 | * Karma: changed semantics of `char_()`, `string()`, `int_()` et.al., and | |
551 | `double_()` et.al.: all of these generators now always expose an attribute. | |
552 | If they do not have an associated attribute, they generate their immediate | |
553 | literal. If they have an associated attribute, the generators first test if | |
554 | the attribute value is equal to the immediate literal. They fail and do not | |
555 | generate anything if those are not equal. Otherwise they generate their | |
556 | immediate literal. For more information see for instance [signed_int `int_`]. | |
557 | * `karma::lit()` can now be used to generate integer and floating point numbers | |
558 | * `qi::rule` and `karma::rule` now can be directly initialized using their copy | |
559 | constructor. I.e. this works now: `qi::rule<...> r = ...some parser...;`. | |
560 | * Added `qi::attr()` exposing its immediate parameter as its attribute. | |
561 | * Added boolean parsers and generators (`bool_`, `true_`, `false_`). | |
562 | * Added `attr_cast<>` enabling in place attribute type conversion in Qi and Karma | |
563 | grammars. | |
564 | * Almost all Karma generators now accept `optional<>` attributes and will fail | |
565 | generating if this is not initialized. | |
566 | * Qi and Karma rules now automatically detect whether to apply auto-rule | |
567 | semantics or not (no need for using `operator%=()` anymore, even if it's still | |
568 | existing). Auto-rule semantics are applied if the right hand side has no | |
569 | semantic actions attached to any of the elements. This works for rule | |
570 | initialization and assignment. | |
571 | * Qi and Karma rules now do intrinsic attribute transformation based on the | |
572 | attribute customization point __customize_transform_attribute__. | |
573 | * All char_ parsers now always expose an attribute. Earlier `char_(...)` didn't | |
574 | expose an attribute while `char_` did. If you need a literal parser not exposing | |
575 | any attribute use `lit(...)` instead. | |
576 | * The qi::int_spec, qi::real_spec, karma::int_spec, and karma real_spec types | |
577 | do not exist anymore. These have been replaced with qi::int_parser, | |
578 | qi::real_parser, karma::int_generator, and karma::real_generator. | |
579 | ||
580 | [heading What's changed in __lex__ from V2.0 (Boost V1.37.0) to V2.1 (Boost V1.41.0)] | |
581 | ||
582 | Here is a list of changes in __lex__ since version 2.0. __lex__ 2.1 is a | |
583 | complete rewrite of the __lex__ distributed with Boost V1.37. As with all | |
584 | code portions of the __spirit__ library, __lex__ is usable as stand alone piece. | |
585 | __lex__ now uses the infrastructure provided by __spirit__ version 2.1. | |
586 | ||
587 | * The lex::lexer_def class has been renamed to lex::lexer, while the original | |
588 | class lex::lexer does not exist anymore. This simplifies the creation of | |
589 | lexers. | |
590 | * The lex::lexer class does not have the function `def(Self& self)` anymore, | |
591 | token definitions can be added to the lexer at any time, usually in the | |
592 | constructor of the user defined lexer class: | |
593 | `` | |
594 | template <typename Lexer> | |
595 | struct example_tokens : lex::lexer<Lexer> | |
596 | { | |
597 | example_tokens() | |
598 | { | |
599 | // your token definitions here | |
600 | this->self = ... | |
601 | } | |
602 | }; | |
603 | `` | |
604 | * The new lexer class can now be used directly. The function `make_lexer()` has | |
605 | been removed. | |
606 | * The `lex::tokenize_and_parse()` and `lex::tokenize_and_phrase_parse()` functions | |
607 | have been changed to match the parameter sequence as implemented by the | |
608 | `qi::parse()` and `qi::phrase_parse()` functions. | |
609 | Both take an arbitrary number of attribute arguments as the last | |
610 | parameters. This argument list is limited by the macro | |
611 | `SPIRIT_ARGUMENTS_LIMIT`. | |
612 | * The `lex::lexertl_lexer`, and `lex::lexertl_token` | |
613 | classes have been moved to the `lex::lexertl` namespace and the names have been | |
614 | changed to `lex::lexertl::lexer`, `lex::lexertl::token`. This also applies to | |
615 | the `lex::lexert_actor_lexer`, and the `static_lexertl_*` family of types. | |
616 | * The class `lex::lexertl_token_set` has been removed. This functionality is now | |
617 | available from the lexer class. | |
618 | * The __lex__ library has been updated to use the newest version of Ben | |
619 | Hansons __lexertl__ lexer construction library (Boost review pending). | |
620 | * The `lex::lexer<Lexer>` template constructor now takes an optional parameter | |
621 | specifying the `match_flags` to be used for table generation. Currently, there | |
622 | are the following flags available: | |
623 | `` | |
624 | match_flags::match_default, // no flags | |
625 | match_flags::match_not_dot_newline, // the regex '.' doesn't match newlines | |
626 | match_flags::match_icase // all matching operations are case insensitive | |
627 | `` | |
628 | If no parameter is passed to the constructor, `match_flags::match_default` is | |
629 | used, i.e. the `.` matches newlines and matching is case sensitive. | |
630 | ||
631 | * The `char_()` and `string()` placeholders can now be used for token | |
632 | definitions and are synonymous with `token_def`. | |
633 | * Lexer semantic actions now have to conform to a changed interface (see | |
634 | __sec_lex_semactions__ for details). | |
635 | * Added placeholder symbols usable from the inside of lexer semantic actions | |
636 | while using Phoenix: `lex::_start`, `lex::_end`, `lex::_eoi`, `lex::_state`, | |
637 | `lex::_val`, and `lex::_pass` (see __sec_lex_semactions__ for more details). | |
638 | * Added (lazy) support functions usable from the inside of lexer semantic | |
639 | actions while using Phoenix: `lex::more()`, `lex::less()`, and | |
640 | `lex::lookahead()` (see __sec_lex_semactions__ for more details). | |
641 | * Removed `lex::omitted` in favor of `lex::omit` to unify the overall | |
642 | interface. | |
643 | ||
644 | [endsect] [/ spirit_2_1] | |
645 | ||
646 | [/////////////////////////////////////////////////////////////////////////////] | |
647 | [section:spirit_1_x Spirit Classic] | |
648 | ||
649 | The Spirit V1.8.x code base has been integrated with Spirit V2. It is | |
650 | now called __classic__. Since the directory structure has changed (the | |
651 | Spirit Classic headers are now moved to the | |
652 | '''$BOOST_ROOT/boost/spirit/home/classic''' directory), we created | |
653 | forwarding headers allowing existing applications to compile without | |
654 | any change. However, these forwarding headers are deprecated, which | |
655 | will result in corresponding warnings generated for each of the | |
656 | headers starting with Boost V1.38. The forwarding headers are expected | |
657 | to be removed in the future. | |
658 | ||
659 | The recommended way of using Spirit Classic now is to include header | |
660 | files from the directory '''$BOOST_ROOT/boost/spirit/include'''. All | |
661 | Spirit Classic headers in this directory have 'classic_' prefixed to | |
662 | their name. For example the include | |
663 | ||
664 | #include <boost/spirit/core/core.hpp> | |
665 | ||
666 | now should be written as: | |
667 | ||
668 | #include <boost/spirit/include/classic_core.hpp> | |
669 | ||
670 | To avoid namespace conflicts with the new Spirit V2 library we moved | |
671 | Spirit Classic into the namespace `boost::spirit::classic`. All | |
672 | references to the former namespace `boost::spirit` need to be adjusted | |
673 | as soon as the header names are corrected as described above. As an | |
674 | alternative you can define the preprocessor constant | |
675 | `BOOST_SPIRIT_USE_OLD_NAMESPACE`, which will force the Spirit Classic | |
676 | code to be in the namespace `boost::spirit` as before. This is not | |
677 | recommended, though, as it may result in naming clashes. | |
678 | ||
679 | The change of the namespace will be automatically deactivated whenever | |
680 | the deprecated include files are being used. This ensures full | |
681 | backwards compatibility for existing applications. | |
682 | ||
683 | [endsect] [/ spirit_1_x] | |
684 | ||
685 | [endsect] |