employee.cpp
来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 140 行
CPP
140 行
/*============================================================================= Copyright (c) 2002-2007 Joel de Guzman Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)=============================================================================*//////////////////////////////////////////////////////////////////////////////////// A parser for arbitrary tuples. This example presents a parser// for an employee structure.//// [ JDG May 9, 2007 ]/////////////////////////////////////////////////////////////////////////////////#include <boost/config/warning_disable.hpp>#include <boost/spirit/include/qi.hpp>#include <boost/spirit/include/phoenix_core.hpp>#include <boost/spirit/include/phoenix_operator.hpp>#include <boost/spirit/include/phoenix_object.hpp>#include <boost/fusion/include/adapt_struct.hpp>#include <boost/fusion/include/io.hpp>#include <iostream>#include <string>#include <complex>using namespace boost::phoenix;using namespace boost::spirit;using namespace boost::spirit::qi;using namespace boost::spirit::ascii;using namespace boost::spirit::arg_names;///////////////////////////////////////////////////////////////////////////////// Our employee struct/////////////////////////////////////////////////////////////////////////////////[tutorial_employee_structstruct employee{ int age; std::string surname; std::string forename; double salary;};//]// We need to tell fusion about our employee struct// to make it a first-class fusion citizen//[tutorial_employee_adapt_structBOOST_FUSION_ADAPT_STRUCT( employee, (int, age) (std::string, surname) (std::string, forename) (double, salary))//]///////////////////////////////////////////////////////////////////////////////// Our employee parser/////////////////////////////////////////////////////////////////////////////////[tutorial_employee_parsertemplate <typename Iterator>struct employee_parser : grammar<Iterator, employee(), space_type>{ employee_parser() : employee_parser::base_type(start) { quoted_string %= lexeme['"' >> +(char_ - '"') >> '"']; start %= lit("employee") >> '{' >> int_ >> ',' >> quoted_string >> ',' >> quoted_string >> ',' >> double_ >> '}' ; } rule<Iterator, std::string(), space_type> quoted_string; rule<Iterator, employee(), space_type> start;};//]////////////////////////////////////////////////////////////////////////////// Main program////////////////////////////////////////////////////////////////////////////intmain(){ std::cout << "/////////////////////////////////////////////////////////\n\n"; std::cout << "\t\tAn employee parser for Spirit...\n\n"; std::cout << "/////////////////////////////////////////////////////////\n\n"; std::cout << "Give me an employee of the form :" << "employee{age, \"surname\", \"forename\", salary } \n"; std::cout << "Type [q or Q] to quit\n\n"; typedef std::string::const_iterator iterator_type; typedef employee_parser<iterator_type> employee_parser; employee_parser g; // Our grammar std::string str; while (getline(std::cin, str)) { if (str.empty() || str[0] == 'q' || str[0] == 'Q') break; employee emp; std::string::const_iterator iter = str.begin(); std::string::const_iterator end = str.end(); bool r = phrase_parse(iter, end, g, emp, space); if (r && iter == end) { std::cout << boost::fusion::tuple_open('['); std::cout << boost::fusion::tuple_close(']'); std::cout << boost::fusion::tuple_delimiter(", "); std::cout << "-------------------------\n"; std::cout << "Parsing succeeded\n"; std::cout << "got: " << boost::fusion::as_vector(emp) << std::endl; std::cout << "\n-------------------------\n"; } else { std::cout << "-------------------------\n"; std::cout << "Parsing failed\n"; std::cout << "-------------------------\n"; } } std::cout << "Bye... :-) \n\n"; return 0;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?