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 + -
显示快捷键?