select_p_with_rule.cpp

来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 90 行

CPP
90
字号
/*=============================================================================    Copyright (c) 2004 Vyacheslav E. Andrejev    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)=============================================================================*/#include <iostream> #define PHOENIX_LIMIT 2#define BOOST_SPIRIT_SELECT_LIMIT 2#define BOOST_SPIRIT_RULE_SCANNERTYPE_LIMIT 2 #include <boost/spirit/include/classic_core.hpp>#include <boost/spirit/include/classic_lists.hpp>#include <boost/spirit/include/classic_select.hpp> using namespace BOOST_SPIRIT_CLASSIC_NS;using namespace std; struct format_grammar : public grammar<format_grammar>{    template <typename ScannerT>    struct definition    {        definition(format_grammar const& /*self*/)        {            descriptor_list =                    list_p(format_descriptor, ch_p(','))                ;            format_descriptor =                     select_p(E_descriptor, EN_descriptor)                ;                E_descriptor = // E[w[.d][Ee]]                    lexeme_d                    [                        (ch_p('E') - (str_p("EN")))                     >> !(                            min_limit_d(1u)[uint_p]                         >> !(ch_p('.') >> uint_p)                         >> !(ch_p('E') >> min_limit_d(1u)[uint_p])                        )                    ]                ;             EN_descriptor = // EN[w[.d][Ee]]                    lexeme_d                    [                        str_p("EN")                     >> !(                            min_limit_d(1u)[uint_p]                         >> !(ch_p('.') >> uint_p)                         >> !(ch_p('E') >> min_limit_d(1u)[uint_p])                        )                    ]                ;        }         rule<ScannerT> descriptor_list;        rule<ScannerT> format_descriptor;        rule<ScannerT> E_descriptor;        rule<ScannerT> EN_descriptor;         rule<ScannerT> const& start() const         {             return descriptor_list;         }    };}; int main(int argc, char* argv[]){    format_grammar grammar;    const char* format = "E2, EN15.7, E20.10E3, E, EN";     parse_info<> pi = parse(format, grammar, blank_p);     if (pi.full) {        cout << "Test concluded successful" << endl;        return 0;    }     else {        BOOST_SPIRIT_ASSERT(false);     // Test fails        return -1;    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?