blob: 3979751ac1ddb8faa3c92cea5af1468f7b1ff235 [file] [log] [blame]
[/==============================================================================
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]