#pragma once #include "cell.h" #include #include #include #include #include #include #include #include namespace qi = boost::spirit::qi; namespace phoenix = boost::phoenix; typedef std::vector expressions; struct Configuration { expressions expressions_; std::string derivation_; Configuration() = default; Configuration(expressions expressions, std::string derivation) : expressions_(expressions), derivation_(derivation) {} ~Configuration() = default; Configuration(const Configuration&) = default; friend std::ostream& operator << (std::ostream& os, const Configuration& config) { os << "Configuration" << std::endl; for (auto& expression : config.expressions_) { os << "Expression=" << expression << std::endl; } return os << "Derviation=" << config.derivation_; } }; BOOST_FUSION_ADAPT_STRUCT( Configuration, (expressions, expressions_) (std::string, derivation_) ) template struct ConfigParser : qi::grammar> { ConfigParser(It first) : ConfigParser::base_type(config_) { using namespace qi; expression_ = +char_("a-zA-Z_0-9"); expressions_ = (expression_ % ','); row_ = (expressions_ > ';' > expression_); config_ = (row_ % "\n"); BOOST_SPIRIT_DEBUG_NODE(expression_); BOOST_SPIRIT_DEBUG_NODE(expressions_); BOOST_SPIRIT_DEBUG_NODE(config_); } private: qi::rule expressions_; qi::rule expression_; qi::rule row_; qi::rule> config_; };