[/==============================================================================
    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:parse_api Parser API]

[//////////////////////////////////////////////////////////////////////////////]
[section:iterator_api Iterator Based Parser API]

[heading Description]

The library provides a couple of free functions to make parsing a snap.
These parser functions have two forms. The first form `parse` works on
the character level. The second `phrase_parse` works on the phrase level
and requires skip parser. Both versions can take in attributes by
reference that will hold the parsed values on a successful parse.

[heading Header]

    // forwards to <boost/spirit/home/qi/parse.hpp>
    #include <boost/spirit/include/qi_parse.hpp>

For variadic attributes:

    // forwards to <boost/spirit/home/qi/parse_attr.hpp>
    #include <boost/spirit/include/qi_parse_attr.hpp>

The variadic attributes version of the API allows one or more
attributes to be passed into the parse functions. The functions taking two 
or more are usable when the parser expression is a __qi_sequence__ only.
In this case each of the attributes passed have to match the corresponding 
part of the sequence.

For the API functions deducing the correct (matching) parser type from the 
supplied attribute type:

    // forwards to <boost/spirit/home/qi/detail/parse_auto.hpp>
    #include <boost/spirit/include/qi_parse_auto.hpp>

Also, see __include_structure__.

[heading Namespace]

[table
    [[Name]]
    [[`boost::spirit::qi::parse` ]]
    [[`boost::spirit::qi::phrase_parse` ]]
    [[`boost::spirit::qi::skip_flag::postskip` ]]
    [[`boost::spirit::qi::skip_flag::dont_postskip` ]]
]

[heading Synopsis]

    namespace boost { namespace spirit { namespace qi
    {
        template <typename Iterator, typename Expr>
        inline bool
        parse(
            Iterator& first
          , Iterator last
          , Expr const& expr);

        template <typename Iterator, typename Expr
          , typename Attr1, typename Attr2, ..., typename AttrN>
        inline bool
        parse(
            Iterator& first
          , Iterator last
          , Expr const& expr
          , Attr1& attr1, Attr2& attr2, ..., AttrN& attrN);

        template <typename Iterator, typename Expr, typename Skipper>
        inline bool
        phrase_parse(
            Iterator& first
          , Iterator last
          , Expr const& expr
          , Skipper const& skipper
          , BOOST_SCOPED_ENUM(skip_flag) post_skip = skip_flag::postskip);

        template <typename Iterator, typename Expr, typename Skipper
          , typename Attr1, typename Attr2, ..., typename AttrN>
        inline bool
        phrase_parse(
            Iterator& first
          , Iterator last
          , Expr const& expr
          , Skipper const& skipper
          , Attr1& attr1, Attr2& attr2, ..., AttrN& attrN);

        template <typename Iterator, typename Expr, typename Skipper
          , typename Attr1, typename Attr2, ..., typename AttrN>
        inline bool
        phrase_parse(
            Iterator& first
          , Iterator last
          , Expr const& expr
          , Skipper const& skipper
          , BOOST_SCOPED_ENUM(skip_flag) post_skip
          , Attr1& attr1, Attr2& attr2, ..., AttrN& attrN);
    }}}

__qi__ parser API functions based on the automatic creation of the matching 
parser type:

    namespace boost { namespace spirit { namespace qi
    {
        template <typename Iterator, typename Attr>
        inline bool
        parse(
            Iterator& first
          , Iterator last
          , Attr& attr);


        template <typename Iterator, typename Attr, typename Skipper>
        inline bool
        phrase_parse(
            Iterator& first
          , Iterator last
          , Attr& attr
          , Skipper const& skipper
          , BOOST_SCOPED_ENUM(skip_flag) post_skip = skip_flag::postskip);
    }}}

All functions above return `true` if none of the involved parser components
failed, and `false` otherwise. 

The maximum number of supported arguments is limited by the preprocessor 
constant `SPIRIT_ARGUMENTS_LIMIT`. This constant defaults to the value defined
by the preprocessor constant `PHOENIX_LIMIT` (which in turn defaults to `10`). 

[note The variadic functions with two or more attributes internally combine 
      references to all passed attributes into a `fusion::vector` and forward 
      this as a combined attribute to the corresponding one attribute function.]

The `phrase_parse` functions not taking an explicit `skip_flag` as one of their 
arguments invoke the passed skipper after a successful match of the parser 
expression. This can be inhibited by using the other versions of that function 
while passing `skip_flag::dont_postskip` to the corresponding argument.

[table
    [[Parameter]                    [Description]]
    [[`Iterator`]                   [__fwditer__ pointing to the source to parse.]]
    [[`Expr`]                       [An expression that can be converted to a Qi parser.]]
    [[`Skipper`]                    [Parser used to skip white spaces.]]
    [[`Attr`]                       [An attribute type utilized to create the corresponding 
                                     parser type from.]]
    [[`Attr1`, `Attr2`, ..., `AttrN`][One or more attributes.]]
]

[endsect] [/ Iterator Based Parser API]

[//////////////////////////////////////////////////////////////////////////////]
[section:stream_api Stream Based Parser API]

[heading Description]

The library provides a couple of Standard IO __iomanip__ allowing to integrate
__qi__ input parsing facilities with Standard input streams.
These parser manipulators have two forms. The first form, `match`, works on
the character level. The second `phrase_match` works on the phrase level
and requires a skip parser. Both versions can take in attributes by reference 
that will hold the parsed values on a successful parse.

[heading Header]

    // forwards to <boost/spirit/home/qi/stream/match_manip.hpp>
    #include <boost/spirit/include/qi_match.hpp>

For variadic attributes:

    // forwards to <boost/spirit/home/qi/stream/match_manip_attr.hpp>
    #include <boost/spirit/include/qi_match_attr.hpp>

The variadic attributes version of the API allows one or more
attributes to be passed into the parse manipulators. The manipulators taking 
two or more attributes are usable when the parser expression is a 
__qi_sequence__ only. In this case each of the attributes passed have to 
match the corresponding part of the sequence.

For the API functions deducing the correct (matching) parser type from the 
supplied attribute type:

    // forwards to <boost/spirit/home/qi/match_auto.hpp>
    #include <boost/spirit/include/qi_match_auto.hpp>

Also, see __include_structure__.

[heading Namespace]

[table
    [[Name]]
    [[`boost::spirit::qi::match` ]]
    [[`boost::spirit::qi::phrase_match` ]]
    [[`boost::spirit::qi::skip_flag::postskip` ]]
    [[`boost::spirit::qi::skip_flag::dont_postskip` ]]
]

[heading Synopsis]

    namespace boost { namespace spirit { namespace qi
    {
        template <typename Expr>
        inline <unspecified> 
        match(
            Expr const& xpr);

        template <typename Expr
          , typename Attr1, typename Attr2, ..., typename AttrN>
        inline <unspecified> 
        match(
            Expr const& xpr
          , Attr1& attr1, Attr2& attr2, ..., AttrN& attrN);

        template <typename Expr, typename Skipper>
        inline <unspecified> 
        phrase_match(
            Expr const& expr
          , Skipper const& s
          , BOOST_SCOPED_ENUM(skip_flag) post_skip = skip_flag::postskip);

        template <typename Expr, typename Skipper
          , typename Attr1, typename Attr2, ..., typename AttrN>
        inline <unspecified> 
        phrase_match(
            Expr const& expr
          , Skipper const& s
          , Attr1& attr1, Attr2& attr2, ..., AttrN& attrN);

        template <typename Expr, typename Skipper
          , typename Attr1, typename Attr2, ..., typename AttrN>
        inline <unspecified> 
        phrase_match(
            Expr const& expr
          , Skipper const& s
          , BOOST_SCOPED_ENUM(skip_flag) post_skip
          , Attr1& attr1, Attr2& attr2, ..., AttrN& attrN);
    }}}

__qi__ parser API functions based on the automatic creation of the matching 
parser type:

    namespace boost { namespace spirit { namespace qi
    {
        template <typename Attr>
        inline <unspecified> 
        match(
            Attr& attr);

        template <typename Attr, typename Skipper>
        inline <unspecified> 
        phrase_match(
            Attr& attr
          , Skipper const& s
          , BOOST_SCOPED_ENUM(skip_flag) post_skip = skip_flag::postskip);
    }}}

All functions above return a standard IO stream manipulator instance (see 
__iomanip__), which when streamed from an input stream will result in parsing
the input using the embedded __qi__ parser expression. Any error (or failed 
parse) occurring during the invocation of the __qi__ parsers will be reflected
in the streams status flag (`std::ios_base::failbit` will be set).

The maximum number of supported arguments is limited by the preprocessor 
constant `SPIRIT_ARGUMENTS_LIMIT`. This constant defaults to the value defined
by the preprocessor constant `PHOENIX_LIMIT` (which in turn defaults to `10`). 

[note The variadic manipulators with two or more attributes internally combine 
      references to all passed attributes into a `fusion::vector` 
      and forward this as a combined attribute to the corresponding manipulator
      taking one attribute.]

The `phrase_match` manipulators not taking an explicit `skip_flag` as one of their 
arguments invoke the passed skipper after a successful match of the parser 
expression. This can be inhibited by using the other versions of that manipulator 
while passing `skip_flag::dont_postskip` to the corresponding argument.

[heading Template parameters]

[table
    [[Parameter]                    [Description]]
    [[`Expr`]                       [An expression that can be converted to a Qi parser.]]
    [[`Skipper`]                    [Parser used to skip white spaces.]]
    [[`Attr`]                       [An attribute type utilized to create the corresponding 
                                     parser type from.]]
    [[`Attr1`, `Attr2`, ..., `AttrN`][One or more attributes.]]
]

[endsect] [/ Stream Based Parser API]

[//////////////////////////////////////////////////////////////////////////////]
[section:create_parser API for Automatic Parser Creation]

[heading Description]

The library implements a special API returning a parser instance for a 
supplied attribute type. This function finds the best matching parser type 
for the attribute based on a set of simple matching rules (as outlined in the 
table below) applied recursively to the attribute type. The returned parser
can be utilized to match input for the provided attribute.

[heading Header]

    // forwards to <boost/spirit/home/qi/auto.hpp>
    #include <boost/spirit/include/qi_auto.hpp>

Also, see __include_structure__.

[heading Namespace]

[table
    [[Name]]
    [[`boost::spirit::qi::create_parser`]]
    [[`boost::spirit::traits::create_parser_exists`]]
]

[heading Synopsis]

    namespace boost { namespace spirit { namespace qi
    {
        template <typename Attr>
        inline <unspecified> 
        create_parser();
    }}}

The returned instance can be directly passed as the parser (or the skipping
parser) to any of the __qi__ API functions. Additionally it
can be assigned to a rule as the rules right hand side expression. This 
function will return a valid parser type only if the meta function 
`traits::create_parser_exists` returns `mpl::true_`. Otherwise it will fail
compiling.

    namespace boost { namespace spirit { namespace traits
    {
        template <typename Attr>
        struct create_parser_exists;
    }}}

The meta function evaluates to `mpl::true_` if `create_parser` would return 
a valid parser for the given type `Attr`.

The following table outlines the mapping rules from the attribute type to the
parser type. These rules are applied recursively to create the parser 
type which can be used to match input for the given attribute type.

[table 
    [[Attribute type]   [Generator type]]
    [[`char`, `wchar_t`]      [`standard::char_`, `standard_wide::char_`]]
    [[`short`, `int`, `long`] [`short_`, `int_`, `long_`]]
    [[`unsigned short`, `unsigned int`, `unsigned long`] 
                              [`ushort_`, `uint_`, `ulong_`]]
    [[`float`, `double`, `long double`] [`float_`, `double_`, `long_double`]]
    [[`short`, `int`, `long`] [`short_`, `int_`, `long_`]]
    [[`long long`, `unsigned long long`]
                              [`long_long`, `ulong_long`]]
    [[`bool`]                 [`bool_`]]
    [[Any (STL) container]    [Kleene Star (unary `'*'`)]]
    [[Any Fusion sequence]    [Sequence operator (`'<<'`)]]
    [[`boost::optional<>`]    [Optional operator (unary `'-'`)]]
    [[`boost::variant<>`]     [Alternative operator (`'|'`)]]
]

[important The mapping for the parsers `long_long` and `ulong_long` are only 
        available on platforms where the preprocessor constant 
        `BOOST_HAS_LONG_LONG` is defined (i.e. on platforms having native 
        support for `long long` and `unsigned long long` (64 bit) signed and 
        unsigned integer types).]

[heading Template parameters]

[table
    [[Parameter]                    [Description]]
    [[`Attr`]                       [An attribute type utilized to create the corresponding 
                                     parser type from.]]
]

[endsect] [/ API for Automatic Parser Creation]

[endsect]
