[#before_8_1]
['Definitions before section 8.1.]

  #include <boost/metaparse/string.hpp>
  #include <boost/metaparse/int_.hpp>

  #include <boost/metaparse/build_parser.hpp>

  using namespace boost::metaparse;

  using exp_parser1 = build_parser<int_>;
  #include <boost/metaparse/entire_input.hpp>

  using exp_parser2 = build_parser<entire_input<int_>>;
  #include <boost/metaparse/token.hpp>

  using exp_parser3 = build_parser<entire_input<token<int_>>>;
  #include <boost/metaparse/lit_c.hpp>

  #include <boost/metaparse/sequence.hpp>

  using exp_parser4 = build_parser<sequence<token<int_>, token<lit_c<'+'>>, token<int_>>>;

  #include <metashell/formatter.hpp>
  
  using int_token = token<int_>;

  using plus_token = token<lit_c<'+'>>;

  using exp_parser5 = build_parser<sequence<int_token, plus_token, int_token>>;
  #include <boost/metaparse/transform.hpp>

  #include <boost/mpl/plus.hpp>

  #include <boost/mpl/at.hpp>

  template <class Vector> 
   struct eval_plus : 
     boost::mpl::plus< 
       typename boost::mpl::at_c<Vector, 0>::type, 
       typename boost::mpl::at_c<Vector, 2>::type 
     > {};

  #include <boost/mpl/quote.hpp>

  using exp_parser6 = 
   build_parser< 
     transform< 
       sequence<int_token, plus_token, int_token>, 
       boost::mpl::quote1<eval_plus> 
     > 
   >;
  #include <boost/metaparse/any.hpp>

  using exp_parser7 = 
   build_parser< 
     sequence< 
       int_token,                                /* The first <number> */ 
       repeated<sequence<plus_token, int_token>> /* The "+ <number>" elements */ 
     > 
   >;
  using temp_result = exp_parser7::apply<BOOST_METAPARSE_STRING("1 + 2 + 3 + 4")>::type;
  #include <boost/mpl/fold.hpp>

  using vector_of_numbers = 
   boost::mpl::vector< 
     boost::mpl::int_<2>, 
     boost::mpl::int_<5>, 
     boost::mpl::int_<6> 
   >;

  template <class Vector> 
   struct sum_vector : 
      boost::mpl::fold< 
        Vector, 
        boost::mpl::int_<0>, 
        boost::mpl::lambda< 
          boost::mpl::plus<boost::mpl::_1, boost::mpl::_2> 
        >::type 
      > 
    {};

  template <class Sum, class Item> 
     struct sum_items : 
       boost::mpl::plus< 
         Sum, 
         typename boost::mpl::at_c<Item, 1>::type 
       > 
   {};
  using exp_parser8 = 
   build_parser< 
     sequence< 
       int_token, /* parse the first <number> */ 
       transform< 
         repeated<sequence<plus_token, int_token>>, /* parse the "+ <number>" elements */ 
         /* lambda expression summarising the "+ <number>" elements using fold */ 
         boost::mpl::lambda< 
           /* The folding expression we have just created */ 
           boost::mpl::fold< 
             boost::mpl::_1, /* the argument of the lambda expression, the result */ 
                             /* of the repeated<...> parser */ 
             boost::mpl::int_<0>, 
             boost::mpl::quote2<sum_items> 
           > 
         >::type 
       > 
     > 
   >;

  using exp_parser9 = 
   build_parser< 
     transform< 
       /* What we had so far */ 
       sequence< 
         int_token, 
         transform< 
           repeated<sequence<plus_token, int_token>>, 
           boost::mpl::lambda< 
             boost::mpl::fold< 
               boost::mpl::_1, 
               boost::mpl::int_<0>, 
               boost::mpl::quote2<sum_items> 
             > 
           >::type 
         > 
       >, 
       boost::mpl::quote1<sum_vector> /* summarise the vector of numbers */ 
     > 
   >;
  #include <boost/metaparse/foldl.hpp>

  using exp_parser10 = 
   build_parser< 
     transform< 
       sequence< 
         int_token, 
         foldl< 
           sequence<plus_token, int_token>, 
           boost::mpl::int_<0>, 
           boost::mpl::quote2<sum_items> 
         > 
       >, 
       boost::mpl::quote1<sum_vector>> 
   >;
  #include <boost/metaparse/foldl_start_with_parser.hpp>

  using exp_parser11 = 
   build_parser< 
     foldl_start_with_parser< 
       sequence<plus_token, int_token>, /* apply this parser repeatedly */ 
       int_token, /* use this parser to get the initial value */ 
       boost::mpl::quote2<sum_items> /* use this function to add a new value to the summary */ 
     > 
   >;
  using minus_token = token<lit_c<'-'>>;

  #include <boost/metaparse/one_of.hpp>

  using exp_parser12 = 
   build_parser< 
     foldl_start_with_parser< 
       sequence<one_of<plus_token, minus_token>, int_token>, 
       int_token, 
       boost::mpl::quote2<sum_items> 
     > 
   >;
  #include <boost/mpl/minus.hpp>

  template <class L, char Op, class R> struct eval_binary_op;

  template <class L, class R> struct eval_binary_op<L, '+', R> : boost::mpl::plus<L, R>::type {};

  template <class L, class R> struct eval_binary_op<L, '-', R> : boost::mpl::minus<L, R>::type {};

  template <class S, class Item> 
   struct binary_op : 
     eval_binary_op< 
       S, 
       boost::mpl::at_c<Item, 0>::type::value, 
       typename boost::mpl::at_c<Item, 1>::type 
     > 
     {};

  using exp_parser13 = 
   build_parser< 
     foldl_start_with_parser< 
       sequence<one_of<plus_token, minus_token>, int_token>, 
       int_token, 
       boost::mpl::quote2<binary_op> 
     > 
   >;
  #include <boost/mpl/times.hpp>

  template <class L, class R> struct eval_binary_op<L, '*', R> : boost::mpl::times<L, R>::type {};

  using times_token = token<lit_c<'*'>>;

  using exp_parser14 = 
   build_parser< 
     foldl_start_with_parser< 
       sequence<one_of<plus_token, minus_token, times_token>, int_token>, 
       int_token, 
       boost::mpl::quote2<binary_op> 
     > 
   >;
  using mult_exp1 = foldl_start_with_parser<sequence<times_token, int_token>, int_token, boost::mpl::quote2<binary_op>>;

  using exp_parser15 = 
   build_parser< 
     foldl_start_with_parser< 
       sequence<one_of<plus_token, minus_token>, mult_exp1>, 
       mult_exp1, 
       boost::mpl::quote2<binary_op> 
     > 
   >;
  #include <boost/mpl/divides.hpp>

  template <class L, class R> struct eval_binary_op<L, '/', R> : boost::mpl::divides<L, R>::type {};

  using divides_token = token<lit_c<'/'>>;

  using mult_exp2 = 
   foldl_start_with_parser< 
     sequence<one_of<times_token, divides_token>, int_token>, 
     int_token, 
     boost::mpl::quote2<binary_op> 
   >;

  using exp_parser16 = 
   build_parser< 
     foldl_start_with_parser< 
       sequence<one_of<plus_token, minus_token>, mult_exp2>, 
       mult_exp2, 
       boost::mpl::quote2<binary_op> 
     > 
   >;

