Skip to content

Instantly share code, notes, and snippets.

@agatan
Created June 12, 2015 05:13
Show Gist options
  • Save agatan/1764ea9c6e7dee6438fa to your computer and use it in GitHub Desktop.
Save agatan/1764ea9c6e7dee6438fa to your computer and use it in GitHub Desktop.
#include <fstream>
#include <iterator>
#include <iostream>
#include <string>
#include <vector>
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix.hpp>
namespace qi = boost::spirit::qi;
namespace phx = boost::phoenix;
template<typename Iterator>
struct LineContSkipper : qi::grammar<Iterator> {
LineContSkipper() : LineContSkipper::base_type(skip) {
skip = qi::char_('\n') | qi::char_(' ') | qi::char_('\t') | "\\\n";
}
qi::rule<Iterator> skip;
};
template<typename Iterator>
struct MyGrammar : qi::grammar<Iterator, std::vector<int>(), LineContSkipper<Iterator>> {
MyGrammar() : MyGrammar::base_type(words) {
words = *(qi::int_)[phx::push_back(qi::_val, qi::_1)];
}
qi::rule<Iterator, std::vector<int>(), LineContSkipper<Iterator>> words;
};
int main(int argc, char const* argv[])
{
std::ifstream ifs(argv[1]);
if (ifs.fail()) {
std::cerr << "failed." << std::endl;
return -1;
}
std::istreambuf_iterator<char> it(ifs);
std::istreambuf_iterator<char> last;
std::string str(it, last);
auto iter = str.cbegin();
auto end_ = str.cend();
MyGrammar<std::string::const_iterator> grammar;
LineContSkipper<std::string::const_iterator> skipper;
std::vector<int> result;
std::cout << str << std::endl;
auto success = qi::phrase_parse(iter, end_, grammar, skipper, result);
if (success && iter == end_) {
for (auto& str : result) {
std::cout << str << std::endl;
}
} else {
std::cout << " => parse failed" << std::endl;
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment