| [/============================================================================== |
| Copyright (C) 2001-2010 Hartmut Kaiser |
| Copyright (C) 2001-2010 Joel de Guzman |
| |
| 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 Auxiliary] |
| |
| This module includes different auxiliary generators not fitting into any of the |
| other categories. It includes the `attr_cast`, `eol`, `eps`, and `lazy` |
| generators. |
| |
| [heading Module Header] |
| |
| // forwards to <boost/spirit/home/karma/auxiliary.hpp> |
| #include <boost/spirit/include/karma_auxiliary.hpp> |
| |
| Also, see __include_structure__. |
| |
| [/////////////////////////////////////////////////////////////////////////////] |
| [section:attr_cast Attribute Transformation Pseudo Generator (`attr_cast`)] |
| |
| [heading Description] |
| |
| The `attr_cast<Exposed, Transformed>()` component invokes the embedded generator |
| while supplying an attribute of type `Transformed`. The supplied attribute gets created |
| from the original attribute (of type `Exposed`) passed to this component using the |
| customization point __customize_transform_attribute__. |
| |
| |
| [heading Header] |
| |
| // forwards to <boost/spirit/home/karma/auxiliary/attr_cast.hpp> |
| #include <boost/spirit/include/karma_attr_cast.hpp> |
| |
| Also, see __include_structure__. |
| |
| [heading Namespace] |
| |
| [table |
| [[Name]] |
| [[`boost::spirit::attr_cast // alias: boost::spirit::karma::attr_cast`]] |
| ] |
| |
| [heading Synopsis] |
| |
| template <Exposed, Transformed> |
| <unspecified> attr_cast(<unspecified>); |
| |
| [heading Template parameters] |
| |
| [table |
| [[Parameter] [Description] [Default]] |
| [[`Exposed`] [The type of the attribute supplied to the `attr_cast`.] [__unused_type__]] |
| [[`Transformed`][The type of the attribute expected by the embedded |
| generator `g`.] [__unused_type__]] |
| ] |
| |
| The `attr_cast` is a function template. It is possible to invoke it using the |
| following schemes: |
| |
| attr_cast(g) |
| attr_cast<Exposed>(g) |
| attr_cast<Exposed, Transformed>(g) |
| |
| depending on which of the attribute types can be deduced properly if not |
| explicitly specified. |
| |
| [heading Model of] |
| |
| [:__unary_generator_concept__] |
| |
| [variablelist Notation |
| [[`g`] [A generator object.]] |
| ] |
| |
| [heading Expression Semantics] |
| |
| Semantics of an expression is defined only where it differs from, or is |
| not defined in __unary_generator_concept__. |
| |
| [table |
| [[Expression] [Semantics]] |
| [[`attr_cast(g)`] [Create a component invoking the |
| generator `g` while passing an attribute of the type |
| as normally expected by `g`. The type of the supplied |
| attribute will be transformed to the type |
| `g` exposes as its attribute type (by using the |
| attribute customization point __customize_transform_attribute__). |
| This generator does not fail unless `g` fails.]] |
| [[`attr_cast<Exposed>(g)`] [Create a component invoking the |
| generator `g` while passing an attribute of the type |
| as normally expected by `g`. The supplied attribute |
| is expected to be of the type `Exposed`, it will be |
| transformed to the type `g` exposes as its attribute type |
| (using the attribute customization point |
| __customize_transform_attribute__). |
| This generator does not fail unless `g` fails.]] |
| [[`attr_cast<Exposed, Transformed>(g)`] [Create a component invoking the |
| generator `g` while passing an attribute of type |
| `Transformed`. The supplied attribute is expected |
| to be of the type `Exposed`, it will be transformed |
| to the type `Transformed` (using the attribute |
| customization point __customize_transform_attribute__). |
| This generator does not fail unless `g` fails.]] |
| ] |
| |
| [heading Attributes] |
| |
| [table |
| [[Expression] [Attribute]] |
| [[`attr_cast(g)`] [`g: A --> attr_cast(g): A`]] |
| [[`attr_cast<Exposed>(g)`] [`g: A --> attr_cast<Exposed>(g): Exposed`]] |
| [[`attr_cast<Exposed, Transformed>(g)`] |
| [`g: A --> attr_cast<Exposed, Transformed>(g): Exposed`]] |
| ] |
| |
| [heading Complexity] |
| |
| [:The complexity of this component is fully defined by the complexity of the |
| embedded generator `g`.] |
| |
| [heading Example] |
| |
| [note The test harness for the example(s) below is presented in the |
| __karma_basics_examples__ section.] |
| |
| Some includes: |
| |
| [reference_karma_includes] |
| |
| Some using declarations: |
| |
| [reference_karma_using_declarations_attr_cast] |
| |
| The example references data structure `int_data` which needs a specialization of |
| the customization point __customize_transform_attribute__: |
| |
| [reference_karma_auxiliary_attr_cast_data1] |
| |
| Now we use the `attr_cast` pseudo generator to invoke the attribute |
| transformation: |
| |
| [reference_karma_attr_cast1] |
| |
| [endsect] |
| |
| [/////////////////////////////////////////////////////////////////////////////] |
| [section:eol End of Line (`eol`)] |
| |
| [heading Description] |
| |
| The `eol` component generates a single newline character. It is equivalent |
| to `lit('\n')` or simply '\\n' (please see the [karma_char `char_`] generator |
| module for more details). |
| |
| [heading Header] |
| |
| // forwards to <boost/spirit/home/karma/auxiliary/eol.hpp> |
| #include <boost/spirit/include/karma_eol.hpp> |
| |
| Also, see __include_structure__. |
| |
| [heading Namespace] |
| |
| [table |
| [[Name]] |
| [[`boost::spirit::eol // alias: boost::spirit::karma::eol`]] |
| ] |
| |
| [heading Model of] |
| |
| [:__primitive_generator_concept__] |
| |
| [heading Expression Semantics] |
| |
| Semantics of an expression is defined only where it differs from, or is |
| not defined in __primitive_generator_concept__. |
| |
| [table |
| [[Expression] [Semantics]] |
| [[`eol`] [Create a component generating a single end of line |
| character in the output. This generator never fails |
| (unless the underlying output stream reports an |
| error).]] |
| ] |
| |
| [heading Attributes] |
| |
| [table |
| [[Expression] [Attribute]] |
| [[`eol`] [__unused__]] |
| ] |
| |
| [heading Complexity] |
| |
| [:O(1)] |
| |
| The complexity is constant as a single character is generated in the output. |
| |
| [heading Example] |
| |
| [note The test harness for the example(s) below is presented in the |
| __karma_basics_examples__ section.] |
| |
| Some includes: |
| |
| [reference_karma_includes] |
| |
| Some using declarations: |
| |
| [reference_karma_using_declarations_eol] |
| |
| Basic usage of the `eol` generator: |
| |
| [reference_karma_eol] |
| |
| [endsect] |
| |
| [/////////////////////////////////////////////////////////////////////////////] |
| [section:eps Epsilon (`eps`)] |
| |
| The family of `eps` components allows to create pseudo generators generating |
| an empty string. This feature is sometimes useful either to force a generator |
| to fail or to succeed or to insert semantic actions into the generation process. |
| |
| [heading Description] |
| |
| The Epsilon (`eps`) is a multi-purpose generator that emits a zero length |
| string. |
| |
| [heading Simple Form] |
| |
| In its simplest form, `eps` creates a component generating an empty string |
| while always succeeding: |
| |
| eps // always emits a zero-length string |
| |
| This form is usually used to trigger a semantic action unconditionally. |
| For example, it is useful in triggering error messages when a set of |
| alternatives fail: |
| |
| r = a | b | c | eps[error()]; // Call error if a, b, and c fail to generate |
| |
| [heading Semantic Predicate] |
| |
| The `eps(b)` component generates an empty string as well, but |
| succeeds only if `b` is `true` and fails otherwise. It's lazy variant `eps(fb)` |
| is equivalent to `eps(b)` except it evaluates the supplied function `fb` at |
| generate time, while using the return value as the criteria to succeed. |
| |
| Semantic predicates allow you to attach a conditional function anywhere |
| in the grammar. In this role, the epsilon takes a __karma_lazy_argument__ that |
| returns `true` or `false`. The __karma_lazy_argument__ is typically a test |
| that is called to resolve ambiguity in the grammar. A generator failure will |
| be reported when the __karma_lazy_argument__ result evaluates to `false`. |
| Otherwise an empty string will be emitted. The general form is: |
| |
| eps_p(fb) << rest; |
| |
| The __karma_lazy_argument__ `fb` is called to do a semantic test. If the test |
| returns true, `rest` will be evaluated. Otherwise, the production will return |
| early without ever touching rest. |
| |
| [heading Header] |
| |
| // forwards to <boost/spirit/home/karma/auxiliary/eps.hpp> |
| #include <boost/spirit/include/karma_eps.hpp> |
| |
| Also, see __include_structure__. |
| |
| [heading Namespace] |
| |
| [table |
| [[Name]] |
| [[`boost::spirit::eps // alias: boost::spirit::karma::eps`]] |
| ] |
| |
| [heading Model of] |
| |
| [:__primitive_generator_concept__] |
| |
| [variablelist Notation |
| [[`b`] [A boolean value.]] |
| [[`fb`] [A __karma_lazy_argument__ that evaluates to a boolean value.]] |
| ] |
| |
| [heading Expression Semantics] |
| |
| Semantics of an expression is defined only where it differs from, or is |
| not defined in __primitive_generator_concept__. |
| |
| [table |
| [[Expression] [Semantics]] |
| [[`eps`] [Creates a component generating an empty string. |
| Succeeds always.]] |
| [[`eps(b)`] [Creates a component generating an empty string. |
| Succeeds if `b` is `true` (unless the underlying |
| output stream reports an error).]] |
| [[`eps(fb)`] [Creates a component generating an empty string. |
| Succeeds if `fb` returns `true` at generate time |
| (unless the underlying output stream reports an |
| error).]] |
| ] |
| |
| [heading Attributes] |
| |
| [table |
| [[Expression] [Attribute]] |
| [[`eps`] [__unused__]] |
| [[`eps(b)`] [__unused__]] |
| [[`eps(fb)`] [__unused__]] |
| ] |
| |
| [heading Complexity] |
| |
| [:O(1)] |
| |
| The complexity is constant as no output is generated. |
| |
| [heading Example] |
| |
| [note The test harness for the example(s) below is presented in the |
| __karma_basics_examples__ section.] |
| |
| Some includes: |
| |
| [reference_karma_includes] |
| |
| Some using declarations: |
| |
| [reference_karma_using_declarations_eps] |
| |
| Basic usage of the `eps` generator: |
| |
| [reference_karma_eps] |
| |
| [endsect] |
| |
| [/////////////////////////////////////////////////////////////////////////////] |
| [section:lazy Lazy (`lazy`)] |
| |
| [heading Description] |
| |
| The family of `lazy` components allows to use a dynamically returned generator |
| component for output generation. It calls the provided function or function |
| object at generate time using its return value as the actual generator to |
| produce the output. |
| |
| [heading Header] |
| |
| // forwards to <boost/spirit/home/karma/auxiliary/lazy.hpp> |
| #include <boost/spirit/include/karma_lazy.hpp> |
| |
| Also, see __include_structure__. |
| |
| [heading Namespace] |
| |
| [table |
| [[Name]] |
| [[`boost::spirit::lazy // alias: boost::spirit::karma::lazy`]] |
| ] |
| |
| [heading Model of] |
| |
| [:__generator_concept__] |
| |
| [variablelist Notation |
| [[`fg`] [A function or function object that evaluates to a generator |
| object (an object exposing the __generator_concept__). This |
| function will be invoked at generate time.]] |
| ] |
| |
| The signature of `fg` is expected to be |
| |
| G f(Unused, Context) |
| |
| where `G`, the function's return value, is the type of the generator to be |
| invoked, and `Context` is the generator's __karma_context__ type (The |
| first argument is __unused__ to make the `Context` the second argument. This |
| is done for uniformity with __karma_actions__). |
| |
| [heading Expression Semantics] |
| |
| Semantics of an expression is defined only where it differs from, or is |
| not defined in __generator_concept__. |
| |
| [table |
| [[Expression] [Semantics]] |
| [[`fg`] [The __boost_phoenix__ function object `fg` will be |
| invoked at generate time. It is expected to return a |
| generator instance. This generator is then invoked |
| in order to generate the output. This generator will |
| succeed as long as the invoked generated succeeds as |
| well (unless the underlying output stream reports |
| an error).]] |
| [[`lazy(fg)`] [The function or function object will be invoked at |
| generate time. It is expected to return a generator |
| instance (note this version of `lazy` does not |
| require `fg` to be a __boost_phoenix__ function |
| object). This generator is then invoked in order to |
| generate the output. This generator will succeed as |
| long as the invoked generated succeeds as well (except |
| if the underlying output stream reports an error).]] |
| ] |
| |
| [heading Attributes] |
| |
| [table |
| [[Expression] [Attribute]] |
| [[`fg`] [The attribute type `G` as exposed by the generator `g` |
| returned from `fg`.]] |
| [[`lazy(fg)`] [The attribute type `G` as exposed by the generator `g` |
| returned from `fg`.]] |
| ] |
| |
| [heading Complexity] |
| |
| The complexity of the `lazy` component is determined by the complexity of the |
| generator returned from `fg`. |
| |
| [heading Example] |
| |
| [note The test harness for the example(s) below is presented in the |
| __karma_basics_examples__ section.] |
| |
| Some includes: |
| |
| [reference_karma_includes] |
| |
| Some using declarations: |
| |
| [reference_karma_using_declarations_lazy] |
| |
| Basic usage of the `lazy` generator: |
| |
| [reference_karma_lazy] |
| |
| [endsect] |
| |
| [endsect] |