epsilon_tests.cpp

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

CPP
137
字号
/*=============================================================================    Copyright (c) 2002-2003 Martin Wille    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 <cstring>#include <boost/detail/lightweight_test.hpp>// This test program only includes the epsilon.hpp header from Spirit#include <boost/spirit/include/classic_epsilon.hpp>#include <boost/detail/lightweight_test.hpp>#include "impl/var.hpp"#include "impl/string_length.hpp"using namespace test;static BOOST_SPIRIT_CLASSIC_NS::parse_info<char const *> pi;////////////////////////////////////////////////// These macros are used with BOOST_TEST#define matches (pi.hit)#define full_match (pi.hit && pi.full)#define partial_match (pi.hit && !pi.full)#define no_match (!pi.hit && !pi.full)#define zero_length_match (pi.length == 0)#define stop_equals_start (pi.stop == s)template<typename ParserT>static voidparse(char const *s, ParserT const &p, bool match){        pi = BOOST_SPIRIT_CLASSIC_NS::parse(s, s + test_impl::string_length(s), p);    if (match)    {        BOOST_TEST(matches);        BOOST_TEST(zero_length_match);        BOOST_TEST(stop_equals_start);    }    else    {        BOOST_TEST(no_match);    }}static char const empty[] = "";static char const not_empty[] = "asdfgh";////////////////////////////////////////////////// Test wether epsilon_p/eps_p work as// primitive parsersstatic voidepsilon_as_primitive(){    // This test case also is a compile time check wether    // both eps_p and epsilon_p are present.    parse(empty, BOOST_SPIRIT_CLASSIC_NS::epsilon_p, true);    BOOST_TEST(full_match);    parse(not_empty, BOOST_SPIRIT_CLASSIC_NS::epsilon_p, true);    BOOST_TEST(partial_match);    parse(empty, BOOST_SPIRIT_CLASSIC_NS::eps_p, true);    BOOST_TEST(full_match);    parse(not_empty, BOOST_SPIRIT_CLASSIC_NS::eps_p, true);    BOOST_TEST(partial_match);}////////////////////////////////////////////////// Test wether epsilon_p/eps_p work correctly as// a parser generator for creating parsers from// functorsstatic voidepsilon_as_parser_generator_for_functors(){    bool       flag = false;    parse(empty, BOOST_SPIRIT_CLASSIC_NS::epsilon_p(var(flag)), flag);    BOOST_TEST(no_match);    flag = true;    parse(empty, BOOST_SPIRIT_CLASSIC_NS::epsilon_p(var(flag)), flag);    BOOST_TEST(full_match);}////////////////////////////////////////////////// Test wether epsilon_p/eps_p work correctly as// a parser generator for creating parsers from// other parsersstatic voidepsilon_as_parser_generator_for_parsers(){    // This test case uses a parser created by epsilon_p    // as body-parser for another invokation of epsilon_p    bool        flag = false;    parse(empty, BOOST_SPIRIT_CLASSIC_NS::epsilon_p(            BOOST_SPIRIT_CLASSIC_NS::epsilon_p(var(flag))), flag);    BOOST_TEST(no_match);    flag = true;    parse(empty, BOOST_SPIRIT_CLASSIC_NS::epsilon_p(            BOOST_SPIRIT_CLASSIC_NS::epsilon_p(var(flag))), flag);    BOOST_TEST(full_match);}////////////////////////////////////////////////// Test wether epsilon_p/eps_p support negationstatic voidnegation_operator_for_epsilon(){    bool       flag = false;    parse(empty, ~BOOST_SPIRIT_CLASSIC_NS::epsilon_p(var(flag)), !flag);    BOOST_TEST(full_match);    parse(empty, ~~BOOST_SPIRIT_CLASSIC_NS::epsilon_p(var(flag)), flag);    BOOST_TEST(no_match);    flag = true;    parse(empty, ~BOOST_SPIRIT_CLASSIC_NS::epsilon_p(var(flag)), !flag);    BOOST_TEST(no_match);    parse(empty, ~~BOOST_SPIRIT_CLASSIC_NS::epsilon_p(var(flag)), flag);    BOOST_TEST(full_match);}intmain(){    epsilon_as_primitive();    epsilon_as_parser_generator_for_functors();    epsilon_as_parser_generator_for_parsers();    negation_operator_for_epsilon();    return boost::report_errors();}

⌨️ 快捷键说明

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