Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- namespace RangeGrammar
- {
- namespace qi = boost::spirit::qi;
- namespace iso8859_1 = boost::spirit::iso8859_1;
- struct RangeResult
- {
- std::wstring start;
- std::wstring limit;
- std::wstring increment;
- };
- }
- BOOST_FUSION_ADAPT_STRUCT(
- RangeGrammar::RangeResult,
- (std::wstring, start)
- (std::wstring, limit)
- (std::wstring, increment)
- )
- namespace RangeGrammar
- {
- template <typename Iterator>
- struct range_parser : boost::spirit::qi::grammar<Iterator, RangeResult(), iso8859_1::space_type>
- {
- range_parser() : range_parser::base_type(start)
- {
- using qi::lit;
- using qi::lexeme;
- using qi::int_;
- using iso8859_1::char_;
- using iso8859_1::digit;
- variable_string %= lexeme["$(" >> +(char_ - ")") >> ")"];
- node = (int_ | variable_string);
- start %=
- lit("_RANGE")
- >> '('
- >> node >> ',' >> node >> ',' >> node
- >> ")_"
- ;
- debug(variable_string);
- debug(start);
- }
- qi::rule<Iterator, std::wstring(), iso8859_1::space_type> variable_string;
- qi::rule<Iterator, std::wstring(), iso8859_1::space_type> node;
- qi::rule<Iterator, RangeResult(), iso8859_1::space_type> start;
- };
- }
- void TestRangeGrammar()
- {
- using boost::spirit::iso8859_1::space;
- typedef std::wstring::const_iterator iterator_type;
- typedef RangeGrammar::range_parser<iterator_type> range_parser;
- range_parser grammar; // Our grammar
- std::array< std::wstring, 1 > testStrings =
- {{
- _TEXT("_RANGE(1, 2, 3 )_")
- }};
- for (auto str : testStrings)
- {
- std::wstring::const_iterator iter = str.begin();
- std::wstring::const_iterator end = str.end();
- RangeGrammar::RangeResult emp;
- bool r = phrase_parse(iter, end, grammar, space, emp);
- if (r)
- {
- std::wcout << _TEXT("-------------------------\n");
- std::wcout << _TEXT("Range Parsing succeeded\n");
- std::wcout << _TEXT("Start: ") << emp.start << std::endl;
- std::wcout << _TEXT("Start: ") << emp.limit << std::endl;
- std::wcout << _TEXT("Start: ") << emp.increment << std::endl;
- std::wcout << _TEXT("\n-------------------------\n");
- }
- else
- {
- std::wcout << _TEXT("-------------------------\n");
- std::wcout << _TEXT("Range Parsing failed\n");
- std::wcout << str << std::endl;
- std::wcout << _TEXT("-------------------------\n");
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement