C++ (Qt)// Изменяем структуру списка поверхностей// Добавляем метод addFace, в котором проверяем передаваемые индексы,// корректируем их при необходимости и добавляем в коллекциюstruct FaceList : public deque<Face>{ void addFace( const Face &f ) { cout << "addFace" << endl; push_back( f ); }}; // И меняем правило получения списка поверхностей// Теперь, после разбора всех индексов одного face, будет вызываться наш метод addFace, в котором мы все будем фиксить// Правило можно упростить, перейдя на форму записи списков (%), но тогда потребуется еще кое что менять - лень.m_face_lst = m_face[ boost::phoenix::bind( &FaceList::addFace, _val, _1 ) ] >> *m_face[ boost::phoenix::bind( &FaceList::addFace, _val, _1 ) ];
C++ (Qt)m_face_lst = m_face[ boost::phoenix::bind( &FaceList::addFace, _val, _1 ) ] >> *m_face[ boost::phoenix::bind( &FaceList::addFace, _val, _1 ) ];
C++ (Qt)struct Group{ string name; FaceList faces;};
C++ (Qt)m_vertex = lit( "v" ) >> double_[ at_c<0>(_val) = _1 ] >> double_[ at_c<1>(_val) = _1 ] >> double_[ at_c<2>(_val) = _1 ] >> -double_[ at_c<3>(_val) = _1 ];
C++ (Qt)#ifndef BIBTEX_PARSER_H#define BIBTEX_PARSER_H #include <string> #include <boost/spirit/include/qi.hpp>#include <boost/spirit/include/phoenix.hpp>#include <boost/fusion/include/std_pair.hpp>#include <boost/fusion/include/map.hpp> #include "core/bibtex_entry.h" namespace bibmake { namespace core { using namespace boost::spirit;namespace phx = boost::phoenix;namespace sw = boost::spirit::standard_wide; namespace detail { template <class Logger>class logger_wrapper_impl{public: logger_wrapper_impl(const Logger & logger) : _logger(logger) {} template <class, class, class, class> struct result { typedef void type; }; template <class Iterator, class String> void operator()(const String & what, Iterator it_1, Iterator it_2, Iterator it_3) const { _logger(what, it_1, it_2, it_3); } private: const Logger & _logger;}; struct default_logger{ template <class Iterator, class String> void operator()(const String & what, Iterator /*it_1*/, Iterator it_2, Iterator it_3) const { std::cerr << "Error! Expecting " << what << " here: \"" << std::string(it_2, it_3) << "\"" << std::endl; }}; } /* namrspace detail */ template <class ForwardIterator>class inner_brace_text : public qi::grammar<ForwardIterator, std::string()>{public: inner_brace_text() : inner_brace_text::base_type(start_) { escaped_brace_ = qi::char_('\\') >> qi::char_; simple_text_ = +(escaped_brace_ | ~qi::char_("{}")); inner_brace_text_ %= simple_text_ | qi::as_string [ qi::char_('{') >> *(inner_brace_text_ | simple_text_) >> qi::char_('}') ]; start_ %= '{' >> qi::omit[*sw::space] >> *inner_brace_text_ >> qi::omit[*sw::space] >> '}'; } private: qi::rule<ForwardIterator, std::string()> simple_text_, inner_brace_text_, escaped_brace_, start_;}; template <class ForwardIterator>class inner_quote_text : public qi::grammar<ForwardIterator, std::string()>{public: inner_quote_text() : inner_quote_text::base_type(start_) { escaped_quote_ = qi::char_('\\') >> qi::char_; inner_quote_text_ = +(escaped_quote_ | ~qi::char_('"')); start_ %= '"' >> qi::omit[*sw::space] >> *inner_quote_text_ >> qi::omit[*sw::space] >> '"'; } private: qi::rule<ForwardIterator, std::string()> inner_quote_text_, escaped_quote_, start_;}; template <class ForwardIterator, class Skipper>class bibtex_parser : public qi::grammar<ForwardIterator, bibtex_entry(), Skipper>{public: template <class Logger = detail::default_logger> bibtex_parser(const Logger & logger = detail::default_logger()) : bibtex_parser::base_type(start_, "BibTeX Parser") { type_ = +qi::alpha; key_ = +(qi::alnum | qi::char_("-_:/")); tag_ = +(qi::alnum | qi::char_("-_:/")); simple_content_ = +qi::alnum; content_ = inner_brace_content_ | inner_quote_content_ | simple_content_; body_ = '{' > key_ > ',' > fields_ >> -qi::lit(',') > '}'; fields_ = -(field_ % ','); field_ = tag_ > '=' > content_; start_ = *~qi::lit('@') >> qi::lit('@') >> type_[phx::at_c<0>(_val) = _1] >> body_ [ phx::at_c<1>(_val) = phx::at_c<0>(_1), phx::at_c<2>(_val) = phx::at_c<1>(_1) ]; start_.name("start"); body_.name("body"); fields_.name("fields"); field_.name("field"); type_.name("type"); key_.name("citation key"); tag_.name("tag"); content_.name("content"); phx::function<detail::logger_wrapper_impl<Logger>> logger_wrapper = detail::logger_wrapper_impl<Logger>(logger); qi::on_error<qi::fail>(start_, logger_wrapper(_4, _1, _3, _2)); } private: qi::rule<ForwardIterator, bibtex_entry(), Skipper> start_; qi::rule<ForwardIterator, std::pair<std::string, bibtex_entry::fields_type>(), Skipper> body_; qi::rule<ForwardIterator, bibtex_entry::fields_type(), Skipper> fields_; qi::rule<ForwardIterator, std::pair<std::string, std::string>(), Skipper> field_; qi::rule<ForwardIterator, std::string()> type_; qi::rule<ForwardIterator, std::string()> key_; qi::rule<ForwardIterator, std::string()> tag_; inner_brace_text<ForwardIterator> inner_brace_content_; inner_quote_text<ForwardIterator> inner_quote_content_; qi::rule<ForwardIterator, std::string()> simple_content_; qi::rule<ForwardIterator, std::string()> content_;}; template <class ForwardIterator, class Container, class Logger = detail::default_logger>bool bibtex_parse(ForwardIterator begin, ForwardIterator end, Container & container, const Logger & logger = detail::default_logger()){ auto skipper = sw::space | '%' >> *(qi::char_ - (qi::eol | qi::eoi)) >> (qi::eol | qi::eoi); bibtex_parser<ForwardIterator, decltype(skipper)> parser(logger); return qi::phrase_parse(begin, end, *parser, skipper, container) && (begin == end);} } /* namespace core */ } /* namespace bibmake */ #endif // BIBTEX_PARSER_H
C++ (Qt)struct default_logger{ template <class Iterator, class String> void operator()(const String & what, Iterator /*it_1*/, Iterator it_2, Iterator it_3) const { std::cerr << "Error! Expecting " << what << " here: \"" << std::string(it_2, it_3) << "\"" << std::endl; }};
Bash@article{Khusainov_JETPLett_2009, year={2009}, issn={0021-3640}, journal={JETP Letters}, volume={90}, number={5}, doi={10.1134/S002136400917010X}, title={Separate re-entrant superconductivity in asymmetric ferromagnet/superconductor/ferromagnet trilayers}, url={http://dx.doi.org/10.1134/S002136400917010X}, publisher={SP MAIK Nauka/Interperiodica}, keywords={74.50.+r; 74.62.-c}, author={Khusainov, M.G. and Khusainov, M.M. and Ivanov, N.M. and Proshin, Yu.N.}, pages={359--364} <<<--------- здесь должна быть запятая language={English}}
C++ (Qt)qi::on_error<qi::retry>(start_, logger_wrapper(_4, _1, _3, _2));
C++ (Qt)void operator()(const String & what, Iterator & it_1, Iterator it_2, Iterator it_3) const { _logger(what, it_1, it_2, it_3); it_1 = it_2; }