refactoring.cpp
来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 215 行
CPP
215 行
/*============================================================================= Copyright (c) 2002-2003 Hartmut Kaiser http://spirit.sourceforge.net/ Use, modification and distribution is subject to 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 example shows the usage of the refactoring parser family parsers// See the "Refactoring Parsers" chapter in the User's Guide.#include <iostream>#include <string>#include <boost/spirit/include/classic_core.hpp>#include <boost/spirit/include/classic_refactoring.hpp>///////////////////////////////////////////////////////////////////////////////// used namespacesusing namespace std;using namespace BOOST_SPIRIT_CLASSIC_NS;///////////////////////////////////////////////////////////////////////////////// actor, used by the refactor_action_p teststruct refactor_action_actor{ refactor_action_actor (std::string &str_) : str(str_) {} template <typename IteratorT> void operator() (IteratorT const &first, IteratorT const &last) const { str = std::string(first, last-first); } std::string &str;};///////////////////////////////////////////////////////////////////////////////// main entry pointint main(){ parse_info<> result; char const *test_string = "Some string followed by a newline\n";/////////////////////////////////////////////////////////////////////////////////// 1. Testing the refactor_unary_d parser//// The following test should successfully parse the test string, because the//// refactor_unary_d[// *anychar_p - '\n'// ]//// is refactored into//// *(anychar_p - '\n').///////////////////////////////////////////////////////////////////////////////// result = parse(test_string, refactor_unary_d[*anychar_p - '\n'] >> '\n'); if (result.full) { cout << "Successfully refactored an unary!" << endl; } else { cout << "Failed to refactor an unary!" << endl; }// Parsing the same test string without refactoring fails, because the// *anychar_p eats up all the input up to the end of the input string. result = parse(test_string, (*anychar_p - '\n') >> '\n'); if (result.full) { cout << "Successfully parsed test string (should not happen)!" << endl; } else { cout << "Correctly failed parsing the test string (without refactoring)!" << endl; } cout << endl;/////////////////////////////////////////////////////////////////////////////////// 2. Testing the refactor_action_d parser//// The following test should successfully parse the test string, because the//// refactor_action_d[// (*(anychar_p - '$'))[refactor_action_actor(str)] >> '$'// ]//// is refactored into//// (*(anychar_p - '$') >> '$')[refactor_action_actor(str)].///////////////////////////////////////////////////////////////////////////////// std::string str; char const *test_string2 = "Some test string ending with a $"; result = parse(test_string2, refactor_action_d[ (*(anychar_p - '$'))[refactor_action_actor(str)] >> '$' ] ); if (result.full && str == std::string(test_string2)) { cout << "Successfully refactored an action!" << endl; cout << "Parsed: \"" << str << "\"" << endl; } else { cout << "Failed to refactor an action!" << endl; }// Parsing the same test string without refactoring fails, because the// the attached actor gets called only for the first part of the string// (without the '$') result = parse(test_string2, (*(anychar_p - '$'))[refactor_action_actor(str)] >> '$' ); if (result.full && str == std::string(test_string2)) { cout << "Successfully parsed test string!" << endl; cout << "Parsed: \"" << str << "\"" << endl; } else { cout << "Correctly failed parsing the test string (without refactoring)!" << endl; cout << "Parsed instead: \"" << str << "\"" << endl; } cout << endl;/////////////////////////////////////////////////////////////////////////////////// 3. Testing the refactor_action_d parser with an embedded (nested)// refactor_unary_p parser//// The following test should successfully parse the test string, because the//// refactor_action_unary_d[// ((*anychar_p)[refactor_action_actor(str)] - '$')// ] >> '$'//// is refactored into//// (*(anychar_p - '$'))[refactor_action_actor(str)] >> '$'.///////////////////////////////////////////////////////////////////////////////// const refactor_action_gen<refactor_unary_gen<> > refactor_action_unary_d = refactor_action_gen<refactor_unary_gen<> >(refactor_unary_d); result = parse(test_string2, refactor_action_unary_d[ ((*anychar_p)[refactor_action_actor(str)] - '$') ] >> '$' ); if (result.full) { cout << "Successfully refactored an action attached to an unary!" << endl; cout << "Parsed: \"" << str << "\"" << endl; } else { cout << "Failed to refactor an action!" << endl; }// Parsing the same test string without refactoring fails, because the// anychar_p eats up all the input up to the end of the string result = parse(test_string2, ((*anychar_p)[refactor_action_actor(str)] - '$') >> '$' ); if (result.full) { cout << "Successfully parsed test string!" << endl; cout << "Parsed: \"" << str << "\"" << endl; } else { cout << "Correctly failed parsing the test string (without refactoring)!" << endl; cout << "Parsed instead: \"" << str << "\"" << endl; } cout << endl; return 0;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?