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