blob: 54d1a5d63a79dd173578dbf1ebc968296ae1bc8e [file] [log] [blame]
/*==============================================================================
Copyright (c) 2006 Tobias Schwinger
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 example uses typeof to build a nonrecursive grammar.
// See boost/spirit/include/rule_parser.hpp for details.
//------------------------------------------------------------------------------
#include <string>
#include <iostream>
#include <boost/typeof/typeof.hpp>
#include <boost/spirit/include/classic_core.hpp>
#include <boost/spirit/include/classic_typeof.hpp>
#include <boost/spirit/include/classic_confix.hpp>
#include <boost/spirit/include/classic_typeof.hpp>
#include <boost/spirit/include/classic_rule_parser.hpp>
// It's important to create an own registration group, even if there are no
// manual Typeof registrations like in this case.
#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
namespace my_project { namespace my_module {
using namespace BOOST_SPIRIT_CLASSIC_NS;
// A semantic action.
void echo_uint(unsigned i) { std::cout << "- " << i << std::endl; }
#define BOOST_SPIRIT__NAMESPACE (2,(my_project,my_module))
// C/C++ comment and whitespace skip parser..
BOOST_SPIRIT_RULE_PARSER(skipper,
-,-,-,
( confix_p("//",*anychar_p,eol_p)
| confix_p("/*",*anychar_p,"*/")
| space_p
)
)
// Parser for unsigned decimal, hexadecimal and binary literals.
BOOST_SPIRIT_RULE_PARSER(uint_literal,
-,-,-,
"0x" >> hex_p[ & echo_uint ]
| "0b" >> bin_p[ & echo_uint ]
| uint_p[ & echo_uint ]
)
// A generic list parser (in some ways similar to Spirit's list_p utility or
// the % operator) with two parameters.
BOOST_SPIRIT_RULE_PARSER(enumeration_parser,
(2,( element_parser, delimiter_parser )),-,-,
element_parser >> *(delimiter_parser >> element_parser)
)
// Parse an optional, comma separated list of uints with explicit post-skip.
BOOST_SPIRIT_RULE_PARSER(line,
-,-,-,
! enumeration_parser(uint_literal,',')
>> lexeme_d[ !skipper ]
)
bool parse_line(char const * str)
{
return BOOST_SPIRIT_CLASSIC_NS::parse(str,line,skipper).full;
}
#undef BOOST_SPIRIT__NAMESPACE
} } // namespace ::my_project::my_module
int main()
{
std::string str;
while (std::getline(std::cin, str))
{
if (str.empty())
break;
str += '\n';
if (my_project::my_module::parse_line(str.c_str()))
std::cout << "\nOK." << std::endl;
else
std::cout << "\nERROR." << std::endl;
}
return 0;
}