[/==============================================================================
    Copyright (C) 2001-2010 Joel de Guzman
    Copyright (C) 2001-2010 Hartmut Kaiser

    Distributed under the Boost Software License, Version 1.0. (See accompanying
    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
===============================================================================/]

[section What's New]

[/////////////////////////////////////////////////////////////////////////////]
[section:spirit_2_4_1 Spirit V2.4.1] 

[heading What's changed in __qi__ and __karma__ from V2.4 (Boost V1.44.0) to V2.4.1 (Boost V1.45.0)]

[heading Bug Fixes]

* Fixed broken __qi__ debugging facilities for optional attributes.
* The __qi__ auto parsers and __karma__ auto generators will now properly work 
  with `signed char` and `unsigned char` as well.
* Fixed a problem in the multi_pass fixed_queue policy.
* Enabled proper modifier handling for the __qi_skip__ directive.
* Fixed a floating point formating problem in Karma (Trac ticket #4742).
* Fixed a problem in [qi_repeat `repeat`]`[]`, which caused the `first` 
  iterator not to be reset on certain parsing failures (see 
  [@http://stackoverflow.com/questions/4009752/boost-spirit-bug-when-mixing-alternates-with-optionals Stack Overflow]).

[endsect] [/ spirit_2_4_1]

[/////////////////////////////////////////////////////////////////////////////]
[section:spirit_2_4 Spirit V2.4] 

[heading What's changed in __qi__ and __karma__ from V2.3 (Boost V1.43.0) to V2.4 (Boost V1.44.0)]

[heading New Features]

* The customization point __customize_transform_attribute__ now takes an additional template
  parameter `Domain` allowing to better specialize the customization point
  for either `qi::domain` or `karma::domain`. 

[important This is a interface breaking change requiring to modify existing 
           code. If you have a specialization of this customization point in 
           your code you need to add the specialization for the new template 
           parameter, i.e. either `qi::domain` or `karma::domain`.]
* Semantic actions in __qi__ now implicitly invoke the function `pre` of the
  customization point __customize_transform_attribute__ to convert the supplied 
  attribute to the exposed attribute type, as needed. The functions 
  `post` and `fail` of this customization point are not invoked by this 
  component (as this would not make any sense).
* Semantic actions in __karma__ now implicitly invoke the function `pre` of the
  customization point __customize_transform_attribute__ to convert the supplied 
  attribute to the consumed attribute type, as needed. 
* Added the __karma__ __karma_skip__ directive which is semantically equivalent
  to the __karma__ __karma_omit__ directive except that it will not execute the 
  embedded generator.
* Added debug support to __karma__ rules. 
* Added strict mode to __karma__, leaving the current behavior (unchanged) as 
  relaxed mode. Added __karma__ compile time directives `strict[]` and 
  `relaxed[]` allowing to switch between the two.
* Added __karma__ __karma_duplicate__ directive which duplicates the supplied
  attribute to all elements of an embedded generator sequence.

[heading Bug Fixes]

* Components in __qi__ and __karma__ now accept one element Fusion sequences as
  their attributes as long as the element in the Fusion sequence is compatible
  with the component's attribute type.
* The character range parser and generator components can now additionally be 
  written as `char_("a", "z")` instead of `char_('a', 'z')` making it 
  consistent with the syntax of the `char_('a')` component (which can be 
  written as `char_("a")` as well). Please note that the mixed syntax forms,
  i.e. `char_('a', "z")` and `char_("a", 'z')`, are not supported.
* Fixed attribute handling in __karma__ sequences when all elements of that
  sequence consume either the same attribute type or containers of that 
  attribute type and the passed in attribute is a container of that attribute 
  type as well. In this case using a repetitive container was supported only
  when it was the last element of the sequence. Now it is possible to 
  have a [karma_repeat `repeat`]`(num)[a]` generator at any position (well, 
  actually you can have any repetitive container at any position now, but this 
  doesn't always make sense as it normally would eat up all supplied attribute 
  values).
* Fixed debug output for variants where a variant element is an STL sequence.
* Fixed a problem in multi_pass, avoiding to loose a character at end of input
  when switching iterators.

[heading What's changed in __lex__ from V2.3 (Boost V1.43.0) to V2.4 (Boost V1.44.0)]

[heading New Lexer Features]

* The lexer is now well integrated with the debug output generated by Qi's
  simple_trace utility. Tokens are printed as: '<' matched sequence '>'.

[heading Lexer Bug Fixes]

* Fixed a problem with using lex::_val as a rvalue in lexer semantic 
  expressions.
* Token values are now available for introspection (as an iterator_range) 
  inside lexer semantic expressions as well.

[endsect] [/ spirit_2_4]

[/////////////////////////////////////////////////////////////////////////////]
[section:spirit_2_3 Spirit V2.3] 

[heading What's changed in __qi__ and __karma__ from V2.2 (Boost V1.42.0) to V2.3 (Boost V1.43.0)]

[heading New Features]

* The customization point `transform_attribute` now has to implement a third 
  function: `void fail(Exposed&)`, which normally will do nothing. This function
  will be called whenever the right hand side of the `rule` (or the embedded
  parser of `attr_cast`) fail parsing. This change affects /Qi/ only. See
  the description of the __customize_transform_attribute__ for more details.
* Added support for attribute sequences created with `BOOST_FUSION_ADAPT_CLASS` 
  and `BOOST_FUSION_ADAPT_CLASS_NAMED`. This support requires to include the 
  new header file: `#include <boost/spirit/inlcude/support_adapt_class_attributes.hpp>`.
* Added `karma::ostream_iterator` as a counterpart to `qi::istream_iterator` 
  (see new header file: `#include <boost/spirit/home/support/iterators/ostream_iterator.hpp>`).
* Added `qi::hold` allowing to make sure the embedded parser does not touch
  the passed attribute in case it fails parsing.
* Added [qi_no_skip `qi::no_skip`] directive, which is equivalent to 
  `qi::`__qi_lexeme__, except that it does not pre-skip.
* Added [karma_no_delimit `karma::no_delimit`] directive, which is equivalent to 
  `karma::`__karma_verbatim__, except that it does not perform a post-delimiting
  step.
* Added a new input_iterator policy for the `multi_pass` iterator framework
  (named `buffering_input_iterator`) allowing to wrap underlying input 
  iterators which do not store the last character read from the input (such as
  `std::istream_iterator`). This is now used as the default input policy.

[heading Bug Fixes]

* Sequences (in /Qi/ and /Karma/) may now have a component having no attribute 
  even as their last element.
* Sequences (in /Qi/ and /Karma/) can now take one element attribute sequences 
  as their attribute.
* Constructs like `karma::buffer[karma::buffer[...]]` don't result in 
  performing double buffering anymore. The same is true if an alternative is 
  wrapped into a `karma::buffer[]` directive (as for instance: `buffer[a] | b`).
* The __karma__ output iterator (which is used internally, but also is exposed
  when using the stream based API) is now properly copyable (thanks to Jonas 
  Persson for reporting this issue).
* The default `multi_pass` iterator is now usable with underlying input 
  iterators which do not store the last character read from the input (such as
  `std::istream_iterator`). Thanks to Larry Evans and Peter Schueller for 
  independently reporting this problem.
* The directive `karma::omit[]` now does not accept an arbitrary attribute 
  type anymore.
* The __karma__ predicates (the and-predicate and the not-predicate) and the 
  directive `karma::omit[]` now disable output altogether instead of 
  intercepting the output into a buffer which got discarded as before.
* Fixed `karma::rule` to properly handles optional attributes.

[heading What's changed in __lex__ from V2.2 (Boost V1.42.0) to V2.3 (Boost V1.43.0)]

[heading New Lexer Features]

* The library does not minimize the generated lexer tables for dynamic lexers by 
  default anymore. The generated tables will now be minimized for static lexers 
  only.
* The function `lexer<>::init_dfa()` now takes a single boolean parameter 
  (which defaults to `false`) allowing to force minimization of the generated
  lexer tables.

[endsect] [/ spirit_2_3]

[//////////////////////////////////////////////////////////////////////////////]
[section:spirit_2_2 Spirit V2.2] 

[heading What's changed in __qi__ and __karma__ from V2.1 (Boost V1.41.0) to V2.2 (Boost V1.42.0)]

[heading New Features]

* Added `auto_` component in __qi__ and __karma__, added API functions 
  `qi::`__create_parser__ and `karma::`__create_generator__.
* Added `auto_` based overloads for all API functions taking no attributes (see
  [link spirit.qi.reference.parse_api /Qi/ API] and 
  [link spirit.karma.reference.generate_api /Karma/ API]).
* Added [karma_columns `karma::columns`] directive.
* Added `karma::`__karma_symbols__ generator.
* The __qi__ customization point __customize_push_back_container__ now returns 
  a `bool` to report whether the item has been added to the container.
* Added an overload for [karma_maxwidth `karma::maxwidth`] directive allowing 
  to specify an additional parameter (any compatible output iterator) receiving 
  the 'overspilled' output (output not fitting into the maxwidth limit).
* It is now possible to use Phoenix expressions as __karma__ attributes.
* Added [link spirit.support.multi_pass.reading_from_standard_input_streams `basic_istream_iterator<Char, Traits>`]
  usable as an equivalent for `std::istream_iterator` except its a __fwditer__
  allowing to parse directly from any `std::basic_istream`.
* Added `qi::`__qi_matches__ directive.

[heading Bug Fixes]

* Fixed karma::alternatives to work with embedded containers of hold_any (i.e.
  constructs like `*stream | "empty"` (which fixes the Karma example 
  basic_facilities.cpp).
* Fixed numeric __karma__ generators for character types.
* Fixed `qi::repeat[]` for unused attributes.
* Fixed rare compilation problem in `karma::repeat[]`.
* Fixed sequences in __qi__ and __karma__ to compile properly if the attribute 
  is a (STL) container of (STL) containers.
* Fixed a problem in `lex::token_def::what`.
* Fixed __qi__ symbols not to match substrings anymore. Added 
  `qi::symbols::prefix_find` to allow matching of (prefix-) substrings.
* Inherited parameters for rule's usually have to be wrapped in function 
  objects (i.e. `phoenix::val`), for integral values this was not necessary. 
  Now all string types can be passed without being wrapped as well (i.e. 
  `std::string`, `char const*`, etc.).
* Added concept checks to all relevant __qi__ API functions enforcing the 
  iterator to be at least of the type `std::forward_iterator_tag`.
* Fixed the `qi::match` and `qi::phrase_match` set of API functions not to
  internally utilize a `std::stream_iterator` anymore as this iterator is of 
  the type `std::input_iterator_tag` only, which is not sufficient for __qi__.

[endsect] [/ spirit_2_2]

[//////////////////////////////////////////////////////////////////////////////]
[section:spirit_2_1 Spirit V2.1] 

[heading What's changed in __qi__ and __karma__ from V2.0 (Boost V1.37.0) to V2.1 (Boost V1.41.0)]

* __spirit__ is now based on the newest version of __boost_proto__
* `qi::phrase_parse`, `qi::phrase_format` now post-skip by default.
* `karma::generate_delimited` and `karma::format_delimited` now don't do pre-
  delimiting by default.
* Changed parameter sequence of `qi::phrase_parse`, `qi::phrase_match`, 
  `karma::generate_delimited`, and `match_delimited`. The attribute is now 
  always the last parameter.
* Added new overloads of those functions allowing to explicitly specify the
  post-skipping and pre-delimiting behavior.
* Added multi attribute API functions
* Removed `grammar_def<>`
* Removed functions `make_parser()` and `make_generator()`
* Removed `qi::none` and `karma::none`
* Sequences and lists now accept a standard container as their attribute
* The string placeholder terminal now can take other strings as its parameter 
  (i.e. std::string)
* All terminals taking literals now accept a (lazy) function object as well
* All placeholders for terminals and directives (such as `int_`, `double_`, 
  `verbatim`, etc.) were previously defined in the namespace `boost::spirit` 
  only. Now these are additionally imported into the namespaces
  `spirit::qi`, `spirit::karma`, and `spirit::lex` (if they are supported by 
  the corresponding sub-library).
* The terminal placeholders `char_` and `string` are not defined in the
  namespace `boost::spirit` anymore as they have been moved to the 
  character set namespaces, allowing to do proper character set 
  handling based on the used namespace (as `spirit::ascii`, etc.)
* The `uint`, `ushort`, `ulong`, and `byte` terminal placeholders have been 
  renamed to `uint_`, `ushort_`, `ulong_`, and `byte_`.
* `qi::skip[]` now re-enables outer skipper if used inside `lexeme[]`
* Added `karma::maxwidth[]` directive (see [karma_maxwidth `maxwidth`])
* Added `karma::omit[]` allowing to consume the attribute of subject generator 
  without emitting any output (see __karma_omit__).
* Added `karma::buffer[]` allowing to avoid unwanted output to be generated in 
  case of a generator failing in the middle of a sequence (see __karma_buffer__).
* `karma::delimit[]` now re-enables outer delimiter if used inside `verbatim[]`
* Karma: added and-predicate (`operator&()`) and not-predicate (`operator!()`)
  Both now always consume an attribute.
* Karma: changed semantics of `char_()`, `string()`, `int_()` et.al., and 
  `double_()` et.al.: all of these generators now always expose an attribute. 
  If they do not have an associated attribute, they generate their immediate 
  literal. If they have an associated attribute, the generators first test if 
  the attribute value is equal to the immediate literal. They fail and do not 
  generate anything if those are not equal. Otherwise they generate their 
  immediate literal. For more information see for instance [signed_int `int_`].
* `karma::lit()` can now be used to generate integer and floating point numbers
* `qi::rule` and `karma::rule` now can be directly initialized using their copy
  constructor. I.e. this works now: `qi::rule<...> r = ...some parser...;`.
* Added `qi::attr()` exposing its immediate parameter as its attribute. 
* Added boolean parsers and generators (`bool_`, `true_`, `false_`).
* Added `attr_cast<>` enabling in place attribute type conversion in Qi and Karma 
  grammars.
* Almost all Karma generators now accept `optional<>` attributes and will fail
  generating if this is not initialized.
* Qi and Karma rules now automatically detect whether to apply auto-rule 
  semantics or not (no need for using `operator%=()` anymore, even if it's still
  existing). Auto-rule semantics are applied if the right hand side has no
  semantic actions attached to any of the elements. This works for rule 
  initialization and assignment.
* Qi and Karma rules now do intrinsic attribute transformation based on the 
  attribute customization point __customize_transform_attribute__.
* All char_ parsers now always expose an attribute. Earlier `char_(...)` didn't 
  expose an attribute while `char_` did. If you need a literal parser not exposing 
  any attribute use `lit(...)` instead.
* The qi::int_spec, qi::real_spec, karma::int_spec, and karma real_spec types 
  do not exist anymore. These have been replaced with qi::int_parser, 
  qi::real_parser, karma::int_generator, and karma::real_generator.

[heading What's changed in __lex__ from V2.0 (Boost V1.37.0) to V2.1 (Boost V1.41.0)]

Here is a list of changes in __lex__ since version 2.0. __lex__ 2.1 is a 
complete rewrite of the __lex__ distributed with Boost V1.37. As with all
code portions of the __spirit__ library, __lex__ is usable as stand alone piece.
__lex__ now uses the infrastructure provided by __spirit__ version 2.1.

* The lex::lexer_def class has been renamed to lex::lexer, while the original
  class lex::lexer does not exist anymore. This simplifies the creation of
  lexers.
* The lex::lexer class does not have the function `def(Self& self)` anymore, 
  token definitions can be added to the lexer at any time, usually in the 
  constructor of the user defined lexer class:
``
      template <typename Lexer>
      struct example_tokens : lex::lexer<Lexer>
      {
            example_tokens()
            {
                // your token definitions here
                this->self = ...
            }
      };
``
* The new lexer class can now be used directly. The function `make_lexer()` has 
  been removed.
* The `lex::tokenize_and_parse()` and `lex::tokenize_and_phrase_parse()` functions 
  have been changed to match the parameter sequence as implemented by the 
  `qi::parse()` and `qi::phrase_parse()` functions. 
  Both take an arbitrary number of attribute arguments as the last 
  parameters. This argument list is limited by the macro
  `SPIRIT_ARGUMENTS_LIMIT`.
* The `lex::lexertl_lexer`, and `lex::lexertl_token`
  classes have been moved to the `lex::lexertl` namespace and the names have been 
  changed to `lex::lexertl::lexer`, `lex::lexertl::token`. This also applies to 
  the `lex::lexert_actor_lexer`, and the `static_lexertl_*` family of types.
* The class `lex::lexertl_token_set` has been removed. This functionality is now 
  available from the lexer class.
* The __lex__ library has been updated to use the newest version of Ben 
  Hansons __lexertl__ lexer construction library (Boost review pending).
* The `lex::lexer<Lexer>` template constructor now takes an optional parameter
  specifying the `match_flags` to be used for table generation. Currently, there
  are the following flags available:
``
        match_flags::match_default,          // no flags
        match_flags::match_not_dot_newline,  // the regex '.' doesn't match newlines
        match_flags::match_icase             // all matching operations are case insensitive
``
  If no parameter is passed to the constructor, `match_flags::match_default` is 
  used, i.e. the `.` matches newlines and matching is case sensitive.

* The `char_()` and `string()` placeholders can now be used for token 
  definitions and are synonymous with `token_def`. 
* Lexer semantic actions now have to conform to a changed interface (see
  __sec_lex_semactions__ for details).
* Added placeholder symbols usable from the inside of lexer semantic actions 
  while using Phoenix: `lex::_start`, `lex::_end`, `lex::_eoi`, `lex::_state`, 
  `lex::_val`, and `lex::_pass` (see __sec_lex_semactions__ for more details).
* Added (lazy) support functions usable from the inside of lexer semantic
   actions while using Phoenix: `lex::more()`, `lex::less()`, and 
   `lex::lookahead()` (see  __sec_lex_semactions__ for more details).
* Removed `lex::omitted` in favor of `lex::omit` to unify the overall 
  interface.

[endsect] [/ spirit_2_1]

[/////////////////////////////////////////////////////////////////////////////]
[section:spirit_1_x Spirit Classic]

The Spirit V1.8.x code base has been integrated with Spirit V2. It is
now called __classic__. Since the directory structure has changed (the
Spirit Classic headers are now moved to the
'''$BOOST_ROOT/boost/spirit/home/classic''' directory), we created
forwarding headers allowing existing applications to compile without
any change. However, these forwarding headers are deprecated, which
will result in corresponding warnings generated for each of the
headers starting with Boost V1.38. The forwarding headers are expected
to be removed in the future.

The recommended way of using Spirit Classic now is to include header
files from the directory '''$BOOST_ROOT/boost/spirit/include'''. All
Spirit Classic headers in this directory have 'classic_' prefixed to
their name. For example the include

    #include <boost/spirit/core/core.hpp>

now should be written as:

    #include <boost/spirit/include/classic_core.hpp>

To avoid namespace conflicts with the new Spirit V2 library we moved
Spirit Classic into the namespace `boost::spirit::classic`. All
references to the former namespace `boost::spirit` need to be adjusted
as soon as the header names are corrected as described above. As an
alternative you can define the preprocessor constant
`BOOST_SPIRIT_USE_OLD_NAMESPACE`, which will force the Spirit Classic
code to be in the namespace `boost::spirit` as before. This is not
recommended, though, as it may result in naming clashes.

The change of the namespace will be automatically deactivated whenever
the deprecated include files are being used. This ensures full
backwards compatibility for existing applications.

[endsect] [/ spirit_1_x]

[endsect]
