escape_char_parser_tests.cpp

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

CPP
192
字号
/*=============================================================================    Copyright (c) 2001-2003 Daniel Nuffer    Copyright (c) 2001-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 <boost/spirit/include/classic_core.hpp>#include <boost/spirit/include/classic_assign_actor.hpp>#include <boost/spirit/include/classic_escape_char.hpp>#include <iostream>#include <boost/detail/lightweight_test.hpp>#include <cstdio>       // for sprintf#if !defined(BOOST_NO_CWCHAR) && !defined(BOOST_NO_SWPRINTF)# include <cwchar>      // for swprintf#endif///////////////////////////////////////////////////////////////////////////////using namespace std;using namespace BOOST_SPIRIT_CLASSIC_NS;///////////////////////////////////////////////////////////////////////////////intmain(){    char c;    // testing good C escapes    BOOST_TEST(parse("a", c_escape_ch_p[assign_a(c)]).full);    BOOST_TEST(c == 'a');    BOOST_TEST(parse("\\b", c_escape_ch_p[assign_a(c)]).full);    BOOST_TEST(c == '\b');    BOOST_TEST(parse("\\t", c_escape_ch_p[assign_a(c)]).full);    BOOST_TEST(c == '\t');    BOOST_TEST(parse("\\n", c_escape_ch_p[assign_a(c)]).full);    BOOST_TEST(c == '\n');    BOOST_TEST(parse("\\f", c_escape_ch_p[assign_a(c)]).full);    BOOST_TEST(c == '\f');    BOOST_TEST(parse("\\r", c_escape_ch_p[assign_a(c)]).full);    BOOST_TEST(c == '\r');    BOOST_TEST(parse("\\\"", c_escape_ch_p[assign_a(c)]).full);    BOOST_TEST(c == '\"');    BOOST_TEST(parse("\\'", c_escape_ch_p[assign_a(c)]).full);    BOOST_TEST(c == '\'');    BOOST_TEST(parse("\\\\", c_escape_ch_p[assign_a(c)]).full);    BOOST_TEST(c == '\\');    BOOST_TEST(parse("\\120", c_escape_ch_p[assign_a(c)]).full);    BOOST_TEST(c == '\120');    BOOST_TEST(parse("\\x2e", c_escape_ch_p[assign_a(c)]).full);    BOOST_TEST(c == '\x2e');    // test bad C escapes    BOOST_TEST(!parse("\\z", c_escape_ch_p[assign_a(c)]).hit);    // testing good lex escapes    BOOST_TEST(parse("a", lex_escape_ch_p[assign_a(c)]).full);    BOOST_TEST(c == 'a');    BOOST_TEST(parse("\\b", lex_escape_ch_p[assign_a(c)]).full);    BOOST_TEST(c == '\b');    BOOST_TEST(parse("\\t", lex_escape_ch_p[assign_a(c)]).full);    BOOST_TEST(c == '\t');    BOOST_TEST(parse("\\n", lex_escape_ch_p[assign_a(c)]).full);    BOOST_TEST(c == '\n');    BOOST_TEST(parse("\\f", lex_escape_ch_p[assign_a(c)]).full);    BOOST_TEST(c == '\f');    BOOST_TEST(parse("\\r", lex_escape_ch_p[assign_a(c)]).full);    BOOST_TEST(c == '\r');    BOOST_TEST(parse("\\\"", lex_escape_ch_p[assign_a(c)]).full);    BOOST_TEST(c == '\"');    BOOST_TEST(parse("\\'", lex_escape_ch_p[assign_a(c)]).full);    BOOST_TEST(c == '\'');    BOOST_TEST(parse("\\\\", lex_escape_ch_p[assign_a(c)]).full);    BOOST_TEST(c == '\\');    BOOST_TEST(parse("\\120", lex_escape_ch_p[assign_a(c)]).full);    BOOST_TEST(c == '\120');    BOOST_TEST(parse("\\x2e", lex_escape_ch_p[assign_a(c)]).full);    BOOST_TEST(c == '\x2e');    BOOST_TEST(parse("\\z", lex_escape_ch_p[assign_a(c)]).full);    BOOST_TEST(c == 'z');    BOOST_TEST(parse("\\a", lex_escape_ch_p[assign_a(c)]).full);    BOOST_TEST(c == 'a');    // test bad lex escapes    BOOST_TEST(!parse("\\xz", lex_escape_ch_p[assign_a(c)]).hit);    // test out of range octal escape    BOOST_TEST(!parse("\\777", lex_escape_ch_p[assign_a(c)]).hit);#if CHAR_MAX == 127    BOOST_TEST(!parse("\\200", lex_escape_ch_p[assign_a(c)]).hit);    BOOST_TEST(parse("\\177", lex_escape_ch_p[assign_a(c)]).full);    BOOST_TEST(c == '\177');#elif CHAR_MAX == 255    BOOST_TEST(!parse("\\400", lex_escape_ch_p[assign_a(c)]).hit);    BOOST_TEST(parse("\\377", lex_escape_ch_p[assign_a(c)]).full);    BOOST_TEST(c == '\377');#endif    // test out of range hex escape    BOOST_TEST(!parse("\\xFFF", lex_escape_ch_p[assign_a(c)]).hit);#if CHAR_MAX == 127    BOOST_TEST(!parse("\\X80", lex_escape_ch_p[assign_a(c)]).hit);    BOOST_TEST(parse("\\X7F", lex_escape_ch_p[assign_a(c)]).full);    BOOST_TEST(c == '\x7f');#elif CHAR_MAX == 255    BOOST_TEST(!parse("\\X100", lex_escape_ch_p[assign_a(c)]).hit);    BOOST_TEST(parse("\\XFf", lex_escape_ch_p[assign_a(c)]).full);    BOOST_TEST(c == '\xff');#endif#ifndef BOOST_NO_CWCHAR    // test wide chars    typedef escape_char_parser<lex_escapes, wchar_t> wlep_t;    wlep_t wlep = wlep_t();    typedef escape_char_parser<c_escapes, wchar_t> wcep_t;    wcep_t wcep = wcep_t();    //wchar_t const* wstr = L"a\\b\\t\\n\\f\\r\\\"\\'\\\\\\120\\x2e";    //wchar_t const* wend(wstr + wcslen(wstr));    wchar_t wc;    BOOST_TEST(parse(L"a", wcep[assign_a(wc)]).hit);    BOOST_TEST(wc == L'a');    BOOST_TEST(parse(L"\\b", wcep[assign_a(wc)]).full);    BOOST_TEST(wc == L'\b');    BOOST_TEST(parse(L"\\t", wcep[assign_a(wc)]).full);    BOOST_TEST(wc == L'\t');    BOOST_TEST(parse(L"\\n", wcep[assign_a(wc)]).full);    BOOST_TEST(wc == L'\n');    BOOST_TEST(parse(L"\\f", wcep[assign_a(wc)]).full);    BOOST_TEST(wc == L'\f');    BOOST_TEST(parse(L"\\r", wcep[assign_a(wc)]).full);    BOOST_TEST(wc == L'\r');    BOOST_TEST(parse(L"\\\"", wcep[assign_a(wc)]).full);    BOOST_TEST(wc == L'\"');    BOOST_TEST(parse(L"\\'", wcep[assign_a(wc)]).full);    BOOST_TEST(wc == L'\'');    BOOST_TEST(parse(L"\\\\", wcep[assign_a(wc)]).full);    BOOST_TEST(wc == L'\\');    BOOST_TEST(parse(L"\\120", wcep[assign_a(wc)]).full);    BOOST_TEST(wc == L'\120');    BOOST_TEST(parse(L"\\x2e", wcep[assign_a(wc)]).full);    BOOST_TEST(wc == L'\x2e');    // test bad wc escapes    BOOST_TEST(!parse(L"\\z", wcep[assign_a(wc)]).hit);    // test out of range octal escape    size_t const octmax_size = 16;    wchar_t octmax[octmax_size];#if !defined(BOOST_NO_SWPRINTF)    swprintf(octmax, octmax_size,      L"\\%lo", (unsigned long)(std::numeric_limits<wchar_t>::max)());    BOOST_TEST(parse(octmax, wlep[assign_a(wc)]).full);    //BOOST_TEST(lex_escape_ch_p[assign_a(wc)].parse(str, end));    BOOST_TEST(wc == (std::numeric_limits<wchar_t>::max)());    swprintf(octmax, octmax_size,      L"\\%lo", (unsigned long)(std::numeric_limits<wchar_t>::max)() + 1);    BOOST_TEST(!parse(octmax, wlep[assign_a(wc)]).hit);    // test out of range hex escape    size_t const hexmax_size = 16;    wchar_t hexmax[hexmax_size];    swprintf(hexmax, hexmax_size,      L"\\x%lx", (unsigned long)(std::numeric_limits<wchar_t>::max)());    BOOST_TEST(parse(hexmax, wlep[assign_a(wc)]).full);    BOOST_TEST(wc == (std::numeric_limits<wchar_t>::max)());    swprintf(hexmax, hexmax_size,      L"\\x%lx", (unsigned long)(std::numeric_limits<wchar_t>::max)() + 1);    BOOST_TEST(!parse(hexmax, wlep[assign_a(wc)]).hit);#endif // !defined(BOOST_NO_SWPRINTF)#endif    return boost::report_errors();}

⌨️ 快捷键说明

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