grammar_tests.cpp

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

CPP
159
字号
/*=============================================================================    Copyright (c) 2001-2003 Joel de Guzman    Copyright (c) 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)=============================================================================*/#include <iostream>#include <boost/detail/lightweight_test.hpp>using namespace std;//#define BOOST_SPIRIT_DEBUG#define BOOST_SPIRIT_SINGLE_GRAMMAR_INSTANCE#include <boost/spirit/include/classic_core.hpp>#include <boost/spirit/include/classic_grammar_def.hpp>using namespace BOOST_SPIRIT_CLASSIC_NS;/////////////////////////////////////////////////////////////////////////////////  This feature is disabled on non compliant compilers (e.g. Borland 5.5.1//  VC6 and VC7)#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) && \    !BOOST_WORKAROUND(__BORLANDC__, <= 0x551) && \    !BOOST_WORKAROUND(__GNUC__, < 3)# define BOOST_SPIRIT_USE_GRAMMARDEF#endif//////////////////////////////////////////////////////////////////////////////////  Grammar tests/////////////////////////////////////////////////////////////////////////////////struct num_list : public grammar<num_list>{    enum {        default_rule = 0,        num_rule = 1,    };    template <typename ScannerT>    struct definition#if defined(BOOST_SPIRIT_USE_GRAMMARDEF)    :   public grammar_def<rule<ScannerT>, same>#endif    {        definition(num_list const& /*self*/)        {            num = int_p;            r = num >> *(',' >> num);#if defined(BOOST_SPIRIT_USE_GRAMMARDEF)            this->start_parsers(r, num);#endif            BOOST_SPIRIT_DEBUG_RULE(num);            BOOST_SPIRIT_DEBUG_RULE(r);        }        rule<ScannerT> r, num;#if !defined(BOOST_SPIRIT_USE_GRAMMARDEF)        rule<ScannerT> const& start() const { return r; }#endif    };};struct num_list_ex : public grammar<num_list_ex>{    enum {        default_rule = 0,        num_rule = 1,        integer_rule = 2    };    template <typename ScannerT>    struct definition#if defined(BOOST_SPIRIT_USE_GRAMMARDEF)    :   public grammar_def<rule<ScannerT>, same, int_parser<int, 10, 1, -1> >#endif    {        definition(num_list_ex const& /*self*/)        {            num = integer;            r = num >> *(',' >> num);#if defined(BOOST_SPIRIT_USE_GRAMMARDEF)            this->start_parsers(r, num, integer);#endif            BOOST_SPIRIT_DEBUG_RULE(num);            BOOST_SPIRIT_DEBUG_RULE(r);        }        rule<ScannerT> r, num;        int_parser<int, 10, 1, -1> integer;#if !defined(BOOST_SPIRIT_USE_GRAMMARDEF)        rule<ScannerT> const& start() const { return r; }#endif    };};voidgrammar_tests(){    num_list nlist;    BOOST_SPIRIT_DEBUG_GRAMMAR(nlist);    parse_info<char const*> pi;    pi = parse("123, 456, 789", nlist, space_p);    BOOST_TEST(pi.hit);    BOOST_TEST(pi.full);#if defined(BOOST_SPIRIT_USE_GRAMMARDEF)    num_list_ex nlistex;    BOOST_SPIRIT_DEBUG_GRAMMAR(nlistex);    pi = parse("123, 456, 789", nlist.use_parser<num_list::default_rule>(),        space_p);    BOOST_TEST(pi.hit);    BOOST_TEST(pi.full);    pi = parse("123", nlist.use_parser<num_list::num_rule>(), space_p);    BOOST_TEST(pi.hit);    BOOST_TEST(pi.full);    pi = parse("123, 456, 789", nlistex, space_p);    BOOST_TEST(pi.hit);    BOOST_TEST(pi.full);    pi = parse("123, 456, 789",        nlistex.use_parser<num_list_ex::default_rule>(), space_p);    BOOST_TEST(pi.hit);    BOOST_TEST(pi.full);    pi = parse("123", nlistex.use_parser<num_list_ex::num_rule>(), space_p);    BOOST_TEST(pi.hit);    BOOST_TEST(pi.full);    pi = parse("123", nlistex.use_parser<num_list_ex::integer_rule>(),        space_p);    BOOST_TEST(pi.hit);    BOOST_TEST(pi.full);#endif // defined(BOOST_SPIRIT_USE_GRAMMARDEF)}///////////////////////////////////////////////////////////////////////////////////  Main/////////////////////////////////////////////////////////////////////////////////intmain(){    grammar_tests();    return boost::report_errors();}

⌨️ 快捷键说明

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