| [/============================================================================== |
| 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 String] |
| |
| This module includes different string oriented generators allowing to output |
| character sequences. It includes the `symbols` generator and variants of the |
| `string` generator. |
| |
| [heading Module Header] |
| |
| // forwards to <boost/spirit/home/karma/string.hpp> |
| #include <boost/spirit/include/karma_string.hpp> |
| |
| Also, see __include_structure__. |
| |
| [section:string String (`string`, `lit`)] |
| |
| [heading Description] |
| |
| The string generators described in this section are: |
| |
| The `string` generator emits a string of characters. The `string` generator |
| is implicitly verbatim: the `delimit` parser is not applied in between |
| characters of the string. The `string` generator has an associated |
| __karma_char_encoding_namespace__. This is needed when doing basic operations |
| such as forcing lower or upper case. Examples: |
| |
| string("Hello") |
| string(L"Hello") |
| string(s) // s is a std::string |
| |
| `lit`, like `string`, also emits a string of characters. The main |
| difference is that `lit` does not consumes an attribute. A plain |
| string like `"hello"` or a `std::basic_string` is equivalent to a `lit`. |
| Examples: |
| |
| "Hello" |
| lit("Hello") |
| lit(L"Hello") |
| lit(s) // s is a std::string |
| |
| [heading Header] |
| |
| // forwards to <boost/spirit/home/karma/string/lit.hpp> |
| #include <boost/spirit/include/karma_string.hpp> |
| |
| Also, see __include_structure__. |
| |
| [heading Namespace] |
| |
| [table |
| [[Name]] |
| [[`boost::spirit::lit // alias: boost::spirit::karma::lit`]] |
| [[`ns::string`]] |
| ] |
| |
| In the table above, `ns` represents a __karma_char_encoding_namespace__ used by the |
| corresponding string generator. |
| |
| [heading Model of] |
| |
| [:__primitive_generator_concept__] |
| |
| [variablelist Notation |
| [[`s`] [Character-class specific string (See __char_class_types__), |
| or a __karma_lazy_argument__ that evaluates to a |
| character-class specific string value]] |
| [[`S`] [The type of a character-class specific string `s`.]] |
| [[`ns`] [A __karma_char_encoding_namespace__.]]] |
| |
| [heading Expression Semantics] |
| |
| Semantics of an expression is defined only where it differs from, or is |
| not defined in __primitive_generator_concept__. |
| |
| [table |
| [[Expression] [Description]] |
| [[`s`] [Generate the string literal `s`. This generator |
| never fails (unless the underlying output stream |
| reports an error).]] |
| [[`lit(s)`] [Generate the string literal `s`. This generator |
| never fails (unless the underlying output stream |
| reports an error).]] |
| [[`ns::string`] [Generate the string provided by a mandatory |
| attribute interpreted in the character set defined |
| by `ns`. This generator never fails (unless the |
| underlying output stream reports an error).]] |
| [[`ns::string(s)`] [Generate the string `s` as provided by the |
| immediate literal value the generator is initialized |
| from. If this generator has an associated attribute |
| it succeeds only if the attribute is equal |
| to the immediate literal (unless the underlying |
| output stream reports an error). Otherwise this |
| generator fails and does not generate any output.]] |
| ] |
| |
| [note The generators `lit(s)` and `string(s)` can be initialized either |
| using a string literal value (i.e. `"abc"`), or using a |
| `std::basic_string<char_type, ...>`, where `char_type` is the required |
| value type of the underlying character sequence.] |
| |
| [heading Attributes] |
| |
| [table |
| [[Expression] [Attribute]] |
| [[`s`] [__unused__]] |
| [[`lit(s)`] [__unused__]] |
| [[`ns::string`] [`S`, attribute is mandatory (otherwise compilation |
| will fail)]] |
| [[`ns::string(s)`] [`S`, attribute is optional, if it is supplied, the |
| generator compares the attribute with `s` and |
| succeeds only if both are equal, failing otherwise]] |
| ] |
| |
| [note In addition to their usual attribute of type `S` all listed generators |
| accept an instance of a `boost::optional<S>` as well. If the |
| `boost::optional<>` is initialized (holds a value) the generators behave |
| as if their attribute was an instance of `S` and emit the value stored |
| in the `boost::optional<>`. Otherwise the generators will fail.] |
| |
| [heading Complexity] |
| |
| [:O(N), where N is the number of characters emitted by the string generator] |
| |
| [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_string] |
| |
| Basic usage of `string` generators: |
| |
| [reference_karma_string] |
| |
| [endsect] |
| |
| [/------------------------------------------------------------------------------] |
| [section:symbols Symbols (`symbols`)] |
| |
| [heading Description] |
| |
| The class `symbols` implements an 'inverse' symbol table: an associative |
| container (or map) of key-value pairs where the values are (most of the time) |
| strings. It maps the value to be generated (the key) to any other value which |
| will be emitted instead of the original key. |
| |
| The Karma symbol table class `symbols` is-a generator, an instance of which may |
| be used anywhere in the grammar specification. It is an example of a |
| dynamic generator. A dynamic generator is characterized by its ability to |
| modify its behavior at run time. Initially, an empty symbols object |
| will emit nothing. At any time, symbols may be added, thus, dynamically |
| altering its behavior. |
| |
| [heading Header] |
| |
| // forwards to <boost/spirit/home/karma/string/symbols.hpp> |
| #include <boost/spirit/include/karma_symbols.hpp> |
| |
| Also, see __include_structure__. |
| |
| [heading Namespace] |
| |
| [table |
| [[Name]] |
| [[`boost::spirit::karma::symbols`]] |
| ] |
| |
| [heading Synopsis] |
| |
| template <typename Attrib, typename T, typename Lookup |
| , typename CharEncoding, typename Tag> |
| struct symbols; |
| |
| [heading Template parameters] |
| |
| [table |
| [[Parameter] [Description] [Default]] |
| [[`Attrib`] [The type of the original attribute to be used as |
| the key into the symbol generator (the symbol).] [`char`]] |
| [[`T`] [The data type associated |
| with each key.] [__unused_type__]] |
| [[`Lookup`] [The symbol search implementation] |
| [if T is `unused_type`, `std::set<Attrib>`, |
| and `std::map<Attrib, T>` otherwise]] |
| [[`CharEncoding`] [Used for character set selection, normally not |
| used by end user.] [__unused_type__]] |
| [[`Tag`] [Used for character set selection, normally not |
| used by end user.] [__unused_type__]] |
| ] |
| |
| [heading Model of] |
| |
| [:__primitive_generator_concept__] |
| |
| [variablelist Notation |
| [[`Sym`] [A `symbols` type.]] |
| [[`Attrib`] [An attribute type.]] |
| [[`T`] [A data type.]] |
| [[`sym`, `sym2`][`symbols` objects.]] |
| [[`sseq`] [An __stl__ container of strings.]] |
| [[`dseq`] [An __stl__ container of data with `value_type` `T`.]] |
| [[`s1`...`sN`] [A __string__.]] |
| [[`d1`...`dN`] [Objects of type `T`.]] |
| [[`f`] [A callable function or function object.]] |
| [[`f`, `l`] [`ForwardIterator` first/last pair.]] |
| ] |
| |
| [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]] |
| [[`Sym()`] [Construct an empty symbols object instance.]] |
| [[`Sym(sym2)`] [Copy construct a symbols from `sym2` (Another `symbols` object).]] |
| [[`Sym(sseq)`] [Construct symbols from `sseq` (An __stl__ container of |
| symbols of type `Attrib`).]] |
| [[`Sym(sseq, dseq)`] [Construct symbols from `sseq` and `dseq` |
| (An __stl__ container of symbols of type `Attrib` and an |
| __stl__ container of data with `value_type` `T`).]] |
| [[`sym = sym2`] [Assign `sym2` to `sym`.]] |
| [[`sym = s1, s2, ..., sN`] [Assign one or more symbols (`s1`...`sN`) to `sym`. The |
| associated data values of type `T` are default constructed.]] |
| [[`sym += s1, s2, ..., sN`] [Add one or more symbols (`s1`...`sN`) to `sym`. The |
| associated data values of type `T` are default constructed.]] |
| [[`sym.add(s1)(s2)...(sN)`] [Add one or more symbols (`s1`...`sN`) to `sym`. The |
| associated data values of type `T` are default constructed.]] |
| [[`sym.add(s1, d1)(s2, d2)...(sN, dN)`] |
| [Add one or more symbols (`s1`...`sN`) |
| with associated data (`d1`...`dN`) to `sym`.]] |
| [[`sym -= s1, s2, ..., sN`] [Remove one or more symbols (`s1`...`sN`) from `sym`.]] |
| [[`sym.remove(s1)(s2)...(sN)`] [Remove one or more symbols (`s1`...`sN`) from `sym`.]] |
| [[`sym.clear()`] [Erase all of the symbols in `sym`.]] |
| [[`sym.at(s)`] [Return a reference to the object associated |
| with symbol, `s`. If `sym` does not already |
| contain such an object, `at` inserts the default |
| object `T()`.]] |
| [[`sym.find(s)`] [Return a pointer to the object associated |
| with symbol, `s`. If `sym` does not already |
| contain such an object, `find` returns a null |
| pointer.]] |
| [[`sym.for_each(f)`] [For each symbol in `sym` `s` invoke |
| `f(typename Lookup::value_type)`.]] |
| ] |
| |
| The symbols generator uses the supplied attribute as the key to be looked up |
| in the internal associative container. If the key exists the generator emits |
| the associated value and succeeds (unless the underlying output stream reports |
| an error). If the value type stored in the symbol generator is __unused_type__ |
| it will emit the key instead. If the key does not exist the generator fails |
| while not emitting anything. |
| |
| [heading Attributes] |
| |
| The attribute of `symbol<Attrib, T>` is `Attrib`. |
| |
| [heading Complexity] |
| |
| The default implementation uses a `std::map<>` or a `std::set<>` with a |
| complexity of: |
| |
| [:O(log n)] |
| |
| Where n is the number of stored symbols. |
| |
| [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_symbols] |
| |
| Basic usage of `symbol` generators: |
| |
| [reference_karma_symbols] |
| |
| [endsect] [/ symbols] |
| |
| [endsect] |