...one of the most highly
regarded and expertly designed C++ library projects in the
world.
— Herb Sutter and Andrei
Alexandrescu, C++
Coding Standards
This version of Spirit now supports the new version of Boost.Phoenix (V3), which has been released as part of Boost V1.47. Please note that this support is purely preliminary and should not be considered production quality. The reason why we are releasing this now is to enable people who want to use the new version of Boost.Phoenix in their code to do so without any conflicts with existing code using Spirit. Generally, no Spirit code needs to be changed. To activate the use of Boost.Phoenix V3 for Spirit you need to define the following preprocessor constant for your builds (before including any of Spirit's include files):
#define BOOST_SPIRIT_USE_PHOENIX_V3 1
utree
,
a generic, hierarchical, and dynamic data structure that can represent
abstract syntax trees. It's well integrated with Spirit.Qi
and Spirit.Karma. It can be passed as an attribute
while parsing to almost any grammar. At the same time, it can be used
as an attribute to generate output from.
BOOST_SPIRIT_TERMINAL_NAME
which takes in two parameters (the terminal name and its type). Before,
there was only one parameter (the terminal name) and the type assumed
the terminal name with _type
appended. This produced invalid C++ identifiers with terminals such as
int_
, which resulted
in generated a type int__type
with a bogus double underscore that is reserved for system use in C++.
_val
now can be used in top level semantic actions outside of any right hand
side of a rule. Here is an example:
int i = 0 BOOST_TEST(test_attr("456", int_[_val = _1], i) && i == 456);In this case _val refers to the attribute value, which is passed in to the
parse()
or phrase_parse()
functions. Similar constructs are now possible in Spirit.Karma
as well:
int i = 123; BOOST_TEST(test("123", int_[_1 = _val], i));This change unifies the handling of the
_val
placeholder allowing to use it everywhere, not only in semantic actions
attached to the right hand sides of a rule.
2
.. 36
.
int_(10)
)
do not consume input on failure anymore.
karma::real_policies<>
preventing the use of const floating
point types with the generator. Thanks to Jeroen Habraken (a.k.a. VeXocide)
for reporting it and for submitting a patch and a test.
attr(attrib)
parser, the Spirit.Qi symbols<>
parser, and the Spirit.Karma symbols<>
generator to properly handle container attributes. These were broken
in Boost V1.46.1 (thanks to Aaron Graham and Joerg Becker for reporting
the problems).
stream
parser to properly adjust
the iterator of the underlying input stream in the case when the stream
parser component was successful. Thanks to Brian O'Kennedy who reported
the problem on Stackoverflow.
repeat
erroneously implemented
commit/rollback semantics for its attribute, leaving it untouched if
the directive failed. This behaviour has been removed as it is inconsistent
with similar components. Existing code relying on this functionality
will break. Please refer to the Spirit.Qi directive
hold
to see how to fix your code.
BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
to prevent instantiations of predefined terminal objects which slows
down compile time a lot. When BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
is defined, the user instantiates the terminals that he needs. So, instead
of writing using qi::uint_
one writes instead: qi::uint_type
uint_
.
lex::char_
and lex::string
.
Both primitives now accept a second parameter which will be interpreted
as the requested token id for any token generated from this definition.
lex::lexertl::position_token<>
, which is essentially plup-in
compatible with the existing lex::lexertl::token<>
class. However it additionally
stores the pair of iterators pointing to the underlying matched input
sequence as an iterator_range.
"*"
as the state
name) when actions were attached to them.
traits::extract_from_container
, which
will be invoked instead of the older customization point traits::extract_from
if the attribute
is a container (traits::is_container
returns true
for the attribute).
hold_any
now
takes a template argument: basic_hold_any<Char>
, where Char
is the character type used for the streaming operators (operator>>()
and operator<<()
).
The hold_any
is still
available as a typedef basic_hold_any<char> hold_any
;