| Цитата(strik @ 29.10.2010, 20:37) | | Вопрос: как можно проверить соответствие каждого символа строки элементу из условия? |
Например, вот так:
| Код | #include <boost/spirit/include/qi.hpp>
#include <iostream> #include <string>
namespace qi = boost::spirit::qi;
template <typename Iterator> struct grammar: qi::grammar<Iterator> { grammar(): grammar::base_type(text) { text = +element; element = qi::char_('a', 'z') | '(' >> text >> ')' | '[' >> text >> ']' | '{' >> text >> '}' ; } qi::rule<Iterator> text, element; };
void parse_string(const std::string & str) { typedef std::string::const_iterator iter_t; iter_t iter = str.begin(); iter_t end = str.end(); grammar<iter_t> g; bool r = qi::parse(iter, end, g); bool success = r && (iter == end); std::cout << "parsing of string \"" << str << "\" " << (success ? "succeeded" : "failed") << std::endl; }
int main(int argc, char **argv) { parse_string("a"); parse_string("abc"); parse_string("(a)"); parse_string("(abc]"); parse_string("[a]"); parse_string("[ab}"); parse_string("{a}"); parse_string("{aaaa{"); parse_string("abc(ddd[e]ff{ggg})zzz"); parse_string("abc(ddd[e]ff{ggg}]zzz"); return 0; }
|
результат работы:
| Код | parsing of string "a" succeeded parsing of string "abc" succeeded parsing of string "(a)" succeeded parsing of string "(abc]" failed parsing of string "[a]" succeeded parsing of string "[ab}" failed parsing of string "{a}" succeeded parsing of string "{aaaa{" failed parsing of string "abc(ddd[e]ff{ggg})zzz" succeeded parsing of string "abc(ddd[e]ff{ggg}]zzz" failed
|
|