12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- /*=============================================================================
- Copyright (c) 2004 Hartmut Kaiser
- http://spirit.sourceforge.net/
- Use, modification and distribution is subject to 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)
- =============================================================================*/
- // This is a compile only test for verifying, whether the multi_pass<>
- // iterator works ok with an input iterator, which returns a value_type and not
- // a reference from its dereferencing operator.
- #include <cstdio>
- #include <fstream>
- #include <iterator>
- #include <boost/spirit/include/classic_core.hpp>
- #include <boost/spirit/include/classic_multi_pass.hpp>
- using namespace BOOST_SPIRIT_CLASSIC_NS;
- using namespace std;
- int main ()
- {
- // create a sample file
- {
- ofstream out("./input_file.txt");
- out << 1.0 << "," << 2.0;
- }
- int result = 0;
- // read in the values from the sample file
- {
- ifstream in("./input_file.txt"); // we get our input from this file
- typedef char char_t;
- typedef multi_pass<istreambuf_iterator<char_t> > iterator_t;
- typedef skip_parser_iteration_policy<space_parser> it_policy_t;
- typedef scanner_policies<it_policy_t> scan_policies_t;
- typedef scanner<iterator_t, scan_policies_t> scanner_t;
- typedef rule<scanner_t> rule_t;
- it_policy_t iter_policy(space_p);
- scan_policies_t policies(iter_policy);
- iterator_t first(make_multi_pass(std::istreambuf_iterator<char_t>(in)));
- scanner_t scan(first, make_multi_pass(std::istreambuf_iterator<char_t>()),
- policies);
- rule_t n_list = real_p >> *(',' >> real_p);
- match<> m = n_list.parse(scan);
- result = !m ? 1 : 0;
- }
- std::remove("./input_file.txt");
- return result;
- }
|