#include <boost/spirit/core.hpp>
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <boost/assign.hpp>
using namespace std ;
using namespace boost ;
using namespace boost::spirit ;
using namespace boost::assign ;
struct parse_it
{
void operator() ( const string& str ) const
{
vector<string> tokens ;
const char* cstr = str.c_str() ;
size_t n = 0 ;
while( n < str.size() )
n += parse( cstr + n,
(+space_p) [ push_back_a( tokens, "SPACE" ) ] |
str_p("daniweb") [ push_back_a( tokens, "WEB" ) ] |
str_p("lexer") [ push_back_a( tokens, "LEX" ) ] |
str_p("tokenizer") [ push_back_a( tokens, "TOK" ) ] |
(+~space_p) [ push_back_a( tokens, "STRING" ) ]
).length ;
cout << '\n' << "parsed: " << str << "\ntokens: " ;
copy( tokens.begin(), tokens.end(),
ostream_iterator<string>(cout," ") ) ;
cout << '\n' ;
}
};
int main()
{
vector<string> test_cases = list_of
( "test daniweb lexer xyz tokenizer lexer" )
( "daniweblexer tokenizerlexer abcd lexerlexer" )
( "daniwebtest lexerdaniweblexertest tokenizerxxx" ) ;
for_each( test_cases.begin(), test_cases.end(), parse_it() ) ;
}
/**
>g++ -Wall -std=c++98 -I/usr/local/include keyword.cpp && ./a.out
parsed: test daniweb lexer xyz tokenizer lexer
tokens: STRING SPACE WEB SPACE LEX SPACE STRING SPACE TOK SPACE LEX
parsed: daniweblexer tokenizerlexer abcd lexerlexer
tokens: WEB LEX SPACE TOK LEX SPACE STRING SPACE LEX LEX
parsed: daniwebtest lexerdaniweblexertest tokenizerxxx
tokens: WEB STRING SPACE LEX WEB LEX STRING SPACE TOK STRING
*/