| /*============================================================================= |
| Copyright (c) 2002-2018 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) |
| =============================================================================*/ |
| /////////////////////////////////////////////////////////////////////////////// |
| // |
| // This is the same employee parser (see employee.cpp) but structured to |
| // allow separate compilation of the actual parser in its own definition |
| // file (employee_def.hpp) and cpp file (employee.cpp). This main cpp file |
| // sees only the header file (employee.hpp). This is a good example on how |
| // parsers are structured in a C++ application. |
| // |
| // [ JDG May 9, 2007 ] |
| // [ JDG May 13, 2015 ] spirit X3 |
| // [ JDG Feb 20, 2018 ] Minimal "best practice" example |
| // |
| // I would like to thank Rainbowverse, llc (https://primeorbial.com/) |
| // for sponsoring this work and donating it to the community. |
| // |
| /////////////////////////////////////////////////////////////////////////////// |
| |
| #include "ast.hpp" |
| #include "ast_adapted.hpp" |
| #include "employee.hpp" |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| // Main program |
| /////////////////////////////////////////////////////////////////////////////// |
| int |
| main() |
| { |
| 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, \"forename\", \"surname\", salary } \n"; |
| std::cout << "Type [q or Q] to quit\n\n"; |
| |
| using boost::spirit::x3::ascii::space; |
| using iterator_type = std::string::const_iterator; |
| using client::employee; |
| |
| std::string str; |
| while (getline(std::cin, str)) |
| { |
| if (str.empty() || str[0] == 'q' || str[0] == 'Q') |
| break; |
| |
| client::ast::employee emp; |
| iterator_type iter = str.begin(); |
| iterator_type const end = str.end(); |
| bool r = phrase_parse(iter, end, employee(), space, emp); |
| |
| 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: " << 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; |
| } |