123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- // 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)
- ///////////////////////////////////////////////////////////////////////////////
- //
- // A character classification example
- //
- // [ HK August 12, 2009 ] spirit2
- //
- ///////////////////////////////////////////////////////////////////////////////
- #include <boost/config/warning_disable.hpp>
- #include <boost/spirit/include/qi.hpp>
- #include <boost/spirit/include/karma.hpp>
- #include <boost/spirit/include/phoenix_core.hpp>
- #include <boost/spirit/include/phoenix_operator.hpp>
- #include <boost/fusion/include/std_pair.hpp>
- #include <iostream>
- #include <string>
- #include <complex>
- namespace client
- {
- ///////////////////////////////////////////////////////////////////////////
- // Our character classification generator
- ///////////////////////////////////////////////////////////////////////////
- //[tutorial_karma_complex_number
- template <typename OutputIterator>
- bool classify_character(OutputIterator sink, char c)
- {
- using boost::spirit::ascii::char_;
- using boost::spirit::ascii::digit;
- using boost::spirit::ascii::xdigit;
- using boost::spirit::ascii::alpha;
- using boost::spirit::ascii::punct;
- using boost::spirit::ascii::space;
- using boost::spirit::ascii::cntrl;
- using boost::spirit::karma::omit;
- using boost::spirit::karma::generate;
- if (!boost::spirit::char_encoding::ascii::isascii_(c))
- return false;
- return generate(sink,
- // Begin grammar
- (
- "The character '" << char_ << "' is "
- << ( &digit << "a digit"
- | &xdigit << "a xdigit"
- | &alpha << "a alpha"
- | &punct << "a punct"
- | &space << "a space"
- | &cntrl << "a cntrl"
- | "of unknown type"
- )
- ),
- // End grammar
- c, c
- );
- }
- //]
- }
- ///////////////////////////////////////////////////////////////////////////////
- // Main program
- ///////////////////////////////////////////////////////////////////////////////
- int main()
- {
- std::cout << "/////////////////////////////////////////////////////////\n\n";
- std::cout << "\t\tA character classification micro generator for Spirit...\n\n";
- std::cout << "/////////////////////////////////////////////////////////\n\n";
- std::cout << "Give me a character to classify\n";
- std::cout << "Type [q or Q] to quit\n\n";
- std::string str;
- while (getline(std::cin, str))
- {
- if (str.empty())
- break;
- std::string generated;
- std::back_insert_iterator<std::string> sink(generated);
- if (!client::classify_character(sink, str[0]))
- {
- std::cout << "-------------------------\n";
- std::cout << "Generating failed\n";
- std::cout << "-------------------------\n";
- }
- else
- {
- std::cout << generated << "\n";
- }
- }
- std::cout << "Bye... :-) \n\n";
- return 0;
- }
|