imgtools/imglib/boostlibrary/boost/regex/v4/basic_regex_parser.hpp
author jjkang
Fri, 25 Jun 2010 18:11:34 +0800
changeset 600 6d08f4a05d93
permissions -rw-r--r--
add deprecated files
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
600
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
     1
/*
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
     2
 *
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
     3
 * Copyright (c) 2004
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
     4
 * John Maddock
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
     5
 *
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
     6
 * Use, modification and distribution are subject to the 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
     7
 * Boost Software License, Version 1.0. (See accompanying file 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
     8
 * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
     9
 *
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    10
 */
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    11
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    12
 /*
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    13
  *   LOCATION:    see http://www.boost.org for most recent version.
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    14
  *   FILE         basic_regex_parser.cpp
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    15
  *   VERSION      see <boost/version.hpp>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    16
  *   DESCRIPTION: Declares template class basic_regex_parser.
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    17
  */
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    18
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    19
#ifndef BOOST_REGEX_V4_BASIC_REGEX_PARSER_HPP
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    20
#define BOOST_REGEX_V4_BASIC_REGEX_PARSER_HPP
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    21
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    22
#ifdef BOOST_MSVC
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    23
#pragma warning(push)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    24
#pragma warning(disable: 4103)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    25
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    26
#ifdef BOOST_HAS_ABI_HEADERS
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    27
#  include BOOST_ABI_PREFIX
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    28
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    29
#ifdef BOOST_MSVC
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    30
#pragma warning(pop)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    31
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    32
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    33
namespace boost{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    34
namespace re_detail{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    35
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    36
#ifdef BOOST_MSVC
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    37
#pragma warning(push)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    38
#pragma warning(disable:4244 4800)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    39
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    40
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    41
template <class charT, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    42
class basic_regex_parser : public basic_regex_creator<charT, traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    43
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    44
public:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    45
   basic_regex_parser(regex_data<charT, traits>* data);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    46
   void parse(const charT* p1, const charT* p2, unsigned flags);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    47
   void fail(regex_constants::error_type error_code, std::ptrdiff_t position);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    48
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    49
   bool parse_all();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    50
   bool parse_basic();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    51
   bool parse_extended();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    52
   bool parse_literal();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    53
   bool parse_open_paren();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    54
   bool parse_basic_escape();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    55
   bool parse_extended_escape();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    56
   bool parse_match_any();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    57
   bool parse_repeat(std::size_t low = 0, std::size_t high = (std::numeric_limits<std::size_t>::max)());
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    58
   bool parse_repeat_range(bool isbasic);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    59
   bool parse_alt();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    60
   bool parse_set();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    61
   bool parse_backref();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    62
   void parse_set_literal(basic_char_set<charT, traits>& char_set);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    63
   bool parse_inner_set(basic_char_set<charT, traits>& char_set);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    64
   bool parse_QE();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    65
   bool parse_perl_extension();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    66
   bool add_emacs_code(bool negate);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    67
   bool unwind_alts(std::ptrdiff_t last_paren_start);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    68
   digraph<charT> get_next_set_literal(basic_char_set<charT, traits>& char_set);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    69
   charT unescape_character();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    70
   regex_constants::syntax_option_type parse_options();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    71
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    72
private:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    73
   typedef bool (basic_regex_parser::*parser_proc_type)();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    74
   typedef typename traits::string_type string_type;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    75
   typedef typename traits::char_class_type char_class_type;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    76
   parser_proc_type           m_parser_proc;    // the main parser to use
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    77
   const charT*               m_base;           // the start of the string being parsed
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    78
   const charT*               m_end;            // the end of the string being parsed
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    79
   const charT*               m_position;       // our current parser position
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    80
   unsigned                   m_mark_count;     // how many sub-expressions we have
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    81
   std::ptrdiff_t             m_paren_start;    // where the last seen ')' began (where repeats are inserted).
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    82
   std::ptrdiff_t             m_alt_insert_point; // where to insert the next alternative
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    83
   bool                       m_has_case_change; // true if somewhere in the current block the case has changed
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    84
#if defined(BOOST_MSVC) && defined(_M_IX86)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    85
   // This is an ugly warning suppression workaround (for warnings *inside* std::vector
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    86
   // that can not otherwise be suppressed)...
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    87
   BOOST_STATIC_ASSERT(sizeof(long) >= sizeof(void*));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    88
   std::vector<long>           m_alt_jumps;      // list of alternative in the current scope.
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    89
#else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    90
   std::vector<std::ptrdiff_t> m_alt_jumps;      // list of alternative in the current scope.
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    91
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    92
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    93
   basic_regex_parser& operator=(const basic_regex_parser&);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    94
   basic_regex_parser(const basic_regex_parser&);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    95
};
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    96
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    97
template <class charT, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    98
basic_regex_parser<charT, traits>::basic_regex_parser(regex_data<charT, traits>* data)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    99
   : basic_regex_creator<charT, traits>(data), m_mark_count(0), m_paren_start(0), m_alt_insert_point(0), m_has_case_change(false)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   100
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   101
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   102
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   103
template <class charT, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   104
void basic_regex_parser<charT, traits>::parse(const charT* p1, const charT* p2, unsigned l_flags)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   105
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   106
   // pass l_flags on to base class:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   107
   this->init(l_flags);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   108
   // set up pointers:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   109
   m_position = m_base = p1;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   110
   m_end = p2;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   111
   // empty strings are errors:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   112
   if((p1 == p2) && 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   113
      (
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   114
         ((l_flags & regbase::main_option_type) != regbase::perl_syntax_group)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   115
         || (l_flags & regbase::no_empty_expressions)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   116
      )
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   117
     )
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   118
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   119
      fail(regex_constants::error_empty, 0);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   120
      return;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   121
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   122
   // select which parser to use:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   123
   switch(l_flags & regbase::main_option_type)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   124
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   125
   case regbase::perl_syntax_group:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   126
      m_parser_proc = &basic_regex_parser<charT, traits>::parse_extended;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   127
      break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   128
   case regbase::basic_syntax_group:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   129
      m_parser_proc = &basic_regex_parser<charT, traits>::parse_basic;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   130
      break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   131
   case regbase::literal:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   132
      m_parser_proc = &basic_regex_parser<charT, traits>::parse_literal;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   133
      break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   134
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   135
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   136
   // parse all our characters:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   137
   bool result = parse_all();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   138
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   139
   // Unwind our alternatives:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   140
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   141
   unwind_alts(-1);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   142
   // reset l_flags as a global scope (?imsx) may have altered them:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   143
   this->flags(l_flags);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   144
   // if we haven't gobbled up all the characters then we must
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   145
   // have had an unexpected ')' :
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   146
   if(!result)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   147
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   148
      fail(regex_constants::error_paren, ::boost::re_detail::distance(m_base, m_position));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   149
      return;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   150
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   151
   // if an error has been set then give up now:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   152
   if(this->m_pdata->m_status)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   153
      return;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   154
   // fill in our sub-expression count:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   155
   this->m_pdata->m_mark_count = 1 + m_mark_count;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   156
   this->finalize(p1, p2);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   157
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   158
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   159
template <class charT, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   160
void basic_regex_parser<charT, traits>::fail(regex_constants::error_type error_code, std::ptrdiff_t position)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   161
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   162
   if(0 == this->m_pdata->m_status) // update the error code if not already set
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   163
      this->m_pdata->m_status = error_code;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   164
   m_position = m_end; // don't bother parsing anything else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   165
   // get the error message:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   166
   std::string message = this->m_pdata->m_ptraits->error_string(error_code);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   167
   // and raise the exception, this will do nothing if exceptions are disabled:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   168
#ifndef BOOST_NO_EXCEPTIONS
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   169
   if(0 == (this->flags() & regex_constants::no_except))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   170
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   171
      boost::regex_error e(message, error_code, position);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   172
      e.raise();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   173
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   174
#else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   175
   (void)position; // suppress warnings.
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   176
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   177
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   178
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   179
template <class charT, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   180
bool basic_regex_parser<charT, traits>::parse_all()
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   181
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   182
   bool result = true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   183
   while(result && (m_position != m_end))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   184
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   185
      result = (this->*m_parser_proc)();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   186
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   187
   return result;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   188
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   189
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   190
#ifdef BOOST_MSVC
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   191
#pragma warning(push)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   192
#pragma warning(disable:4702)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   193
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   194
template <class charT, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   195
bool basic_regex_parser<charT, traits>::parse_basic()
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   196
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   197
   switch(this->m_traits.syntax_type(*m_position))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   198
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   199
   case regex_constants::syntax_escape:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   200
      return parse_basic_escape();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   201
   case regex_constants::syntax_dot:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   202
      return parse_match_any();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   203
   case regex_constants::syntax_caret:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   204
      ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   205
      this->append_state(syntax_element_start_line);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   206
      break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   207
   case regex_constants::syntax_dollar:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   208
      ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   209
      this->append_state(syntax_element_end_line);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   210
      break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   211
   case regex_constants::syntax_star:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   212
      if(!(this->m_last_state) || (this->m_last_state->type == syntax_element_start_line))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   213
         return parse_literal();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   214
      else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   215
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   216
         ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   217
         return parse_repeat();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   218
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   219
   case regex_constants::syntax_plus:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   220
      if(!(this->m_last_state) || (this->m_last_state->type == syntax_element_start_line) || !(this->flags() & regbase::emacs_ex))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   221
         return parse_literal();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   222
      else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   223
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   224
         ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   225
         return parse_repeat(1);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   226
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   227
   case regex_constants::syntax_question:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   228
      if(!(this->m_last_state) || (this->m_last_state->type == syntax_element_start_line) || !(this->flags() & regbase::emacs_ex))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   229
         return parse_literal();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   230
      else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   231
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   232
         ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   233
         return parse_repeat(0, 1);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   234
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   235
   case regex_constants::syntax_open_set:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   236
      return parse_set();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   237
   case regex_constants::syntax_newline:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   238
      if(this->flags() & regbase::newline_alt)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   239
         return parse_alt();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   240
      else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   241
         return parse_literal();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   242
   default:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   243
      return parse_literal();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   244
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   245
   return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   246
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   247
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   248
template <class charT, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   249
bool basic_regex_parser<charT, traits>::parse_extended()
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   250
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   251
   bool result = true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   252
   switch(this->m_traits.syntax_type(*m_position))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   253
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   254
   case regex_constants::syntax_open_mark:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   255
      return parse_open_paren();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   256
   case regex_constants::syntax_close_mark:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   257
      return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   258
   case regex_constants::syntax_escape:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   259
      return parse_extended_escape();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   260
   case regex_constants::syntax_dot:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   261
      return parse_match_any();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   262
   case regex_constants::syntax_caret:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   263
      ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   264
      this->append_state(
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   265
         (this->flags() & regex_constants::no_mod_m ? syntax_element_buffer_start : syntax_element_start_line));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   266
      break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   267
   case regex_constants::syntax_dollar:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   268
      ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   269
      this->append_state(
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   270
         (this->flags() & regex_constants::no_mod_m ? syntax_element_buffer_end : syntax_element_end_line));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   271
      break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   272
   case regex_constants::syntax_star:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   273
      if(m_position == this->m_base)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   274
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   275
         fail(regex_constants::error_badrepeat, 0);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   276
         return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   277
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   278
      ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   279
      return parse_repeat();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   280
   case regex_constants::syntax_question:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   281
      if(m_position == this->m_base)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   282
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   283
         fail(regex_constants::error_badrepeat, 0);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   284
         return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   285
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   286
      ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   287
      return parse_repeat(0,1);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   288
   case regex_constants::syntax_plus:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   289
      if(m_position == this->m_base)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   290
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   291
         fail(regex_constants::error_badrepeat, 0);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   292
         return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   293
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   294
      ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   295
      return parse_repeat(1);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   296
   case regex_constants::syntax_open_brace:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   297
      ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   298
      return parse_repeat_range(false);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   299
   case regex_constants::syntax_close_brace:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   300
      fail(regex_constants::error_brace, this->m_position - this->m_end);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   301
      return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   302
   case regex_constants::syntax_or:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   303
      return parse_alt();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   304
   case regex_constants::syntax_open_set:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   305
      return parse_set();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   306
   case regex_constants::syntax_newline:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   307
      if(this->flags() & regbase::newline_alt)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   308
         return parse_alt();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   309
      else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   310
         return parse_literal();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   311
   case regex_constants::syntax_hash:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   312
      //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   313
      // If we have a mod_x flag set, then skip until
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   314
      // we get to a newline character:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   315
      //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   316
      if((this->flags() 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   317
         & (regbase::no_perl_ex|regbase::mod_x))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   318
         == regbase::mod_x)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   319
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   320
         while((m_position != m_end) && !is_separator(*m_position++)){}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   321
         return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   322
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   323
      // Otherwise fall through:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   324
   default:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   325
      result = parse_literal();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   326
      break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   327
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   328
   return result;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   329
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   330
#ifdef BOOST_MSVC
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   331
#pragma warning(pop)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   332
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   333
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   334
template <class charT, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   335
bool basic_regex_parser<charT, traits>::parse_literal()
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   336
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   337
   // append this as a literal provided it's not a space character
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   338
   // or the perl option regbase::mod_x is not set:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   339
   if(
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   340
      ((this->flags() 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   341
         & (regbase::main_option_type|regbase::mod_x|regbase::no_perl_ex)) 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   342
            != regbase::mod_x)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   343
      || !this->m_traits.isctype(*m_position, this->m_mask_space))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   344
         this->append_literal(*m_position);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   345
   ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   346
   return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   347
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   348
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   349
template <class charT, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   350
bool basic_regex_parser<charT, traits>::parse_open_paren()
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   351
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   352
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   353
   // skip the '(' and error check:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   354
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   355
   if(++m_position == m_end)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   356
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   357
      fail(regex_constants::error_paren, m_position - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   358
      return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   359
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   360
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   361
   // begin by checking for a perl-style (?...) extension:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   362
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   363
   if(
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   364
         ((this->flags() & (regbase::main_option_type | regbase::no_perl_ex)) == 0)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   365
         || ((this->flags() & (regbase::main_option_type | regbase::emacs_ex)) == (regbase::basic_syntax_group|regbase::emacs_ex))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   366
     )
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   367
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   368
      if(this->m_traits.syntax_type(*m_position) == regex_constants::syntax_question)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   369
         return parse_perl_extension();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   370
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   371
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   372
   // update our mark count, and append the required state:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   373
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   374
   unsigned markid = 0;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   375
   if(0 == (this->flags() & regbase::nosubs))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   376
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   377
      markid = ++m_mark_count;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   378
      if(this->flags() & regbase::save_subexpression_location)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   379
         this->m_pdata->m_subs.push_back(std::pair<std::size_t, std::size_t>(std::distance(m_base, m_position) - 1, 0));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   380
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   381
   re_brace* pb = static_cast<re_brace*>(this->append_state(syntax_element_startmark, sizeof(re_brace)));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   382
   pb->index = markid;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   383
   std::ptrdiff_t last_paren_start = this->getoffset(pb);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   384
   // back up insertion point for alternations, and set new point:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   385
   std::ptrdiff_t last_alt_point = m_alt_insert_point;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   386
   this->m_pdata->m_data.align();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   387
   m_alt_insert_point = this->m_pdata->m_data.size();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   388
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   389
   // back up the current flags in case we have a nested (?imsx) group:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   390
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   391
   regex_constants::syntax_option_type opts = this->flags();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   392
   bool old_case_change = m_has_case_change;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   393
   m_has_case_change = false; // no changes to this scope as yet...
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   394
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   395
   // now recursively add more states, this will terminate when we get to a
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   396
   // matching ')' :
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   397
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   398
   parse_all();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   399
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   400
   // Unwind pushed alternatives:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   401
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   402
   if(0 == unwind_alts(last_paren_start))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   403
      return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   404
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   405
   // restore flags:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   406
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   407
   if(m_has_case_change)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   408
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   409
      // the case has changed in one or more of the alternatives
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   410
      // within the scoped (...) block: we have to add a state
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   411
      // to reset the case sensitivity:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   412
      static_cast<re_case*>(
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   413
         this->append_state(syntax_element_toggle_case, sizeof(re_case))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   414
         )->icase = opts & regbase::icase;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   415
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   416
   this->flags(opts);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   417
   m_has_case_change = old_case_change;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   418
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   419
   // we either have a ')' or we have run out of characters prematurely:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   420
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   421
   if(m_position == m_end)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   422
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   423
      this->fail(regex_constants::error_paren, ::boost::re_detail::distance(m_base, m_end));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   424
      return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   425
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   426
   BOOST_ASSERT(this->m_traits.syntax_type(*m_position) == regex_constants::syntax_close_mark);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   427
   if(markid && (this->flags() & regbase::save_subexpression_location))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   428
      this->m_pdata->m_subs.at(markid - 1).second = std::distance(m_base, m_position);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   429
   ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   430
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   431
   // append closing parenthesis state:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   432
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   433
   pb = static_cast<re_brace*>(this->append_state(syntax_element_endmark, sizeof(re_brace)));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   434
   pb->index = markid;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   435
   this->m_paren_start = last_paren_start;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   436
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   437
   // restore the alternate insertion point:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   438
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   439
   this->m_alt_insert_point = last_alt_point;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   440
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   441
   // allow backrefs to this mark:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   442
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   443
   if((markid > 0) && (markid < sizeof(unsigned) * CHAR_BIT))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   444
      this->m_backrefs |= 1u << (markid - 1);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   445
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   446
   return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   447
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   448
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   449
template <class charT, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   450
bool basic_regex_parser<charT, traits>::parse_basic_escape()
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   451
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   452
   ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   453
   bool result = true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   454
   switch(this->m_traits.escape_syntax_type(*m_position))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   455
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   456
   case regex_constants::syntax_open_mark:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   457
      return parse_open_paren();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   458
   case regex_constants::syntax_close_mark:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   459
      return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   460
   case regex_constants::syntax_plus:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   461
      if(this->flags() & regex_constants::bk_plus_qm)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   462
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   463
         ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   464
         return parse_repeat(1);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   465
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   466
      else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   467
         return parse_literal();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   468
   case regex_constants::syntax_question:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   469
      if(this->flags() & regex_constants::bk_plus_qm)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   470
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   471
         ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   472
         return parse_repeat(0, 1);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   473
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   474
      else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   475
         return parse_literal();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   476
   case regex_constants::syntax_open_brace:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   477
      if(this->flags() & regbase::no_intervals)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   478
         return parse_literal();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   479
      ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   480
      return parse_repeat_range(true);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   481
   case regex_constants::syntax_close_brace:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   482
      if(this->flags() & regbase::no_intervals)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   483
         return parse_literal();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   484
      fail(regex_constants::error_brace, this->m_position - this->m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   485
      return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   486
   case regex_constants::syntax_or:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   487
      if(this->flags() & regbase::bk_vbar)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   488
         return parse_alt();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   489
      else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   490
         result = parse_literal();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   491
      break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   492
   case regex_constants::syntax_digit:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   493
      return parse_backref();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   494
   case regex_constants::escape_type_start_buffer:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   495
      if(this->flags() & regbase::emacs_ex)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   496
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   497
         ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   498
         this->append_state(syntax_element_buffer_start);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   499
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   500
      else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   501
         result = parse_literal();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   502
      break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   503
   case regex_constants::escape_type_end_buffer:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   504
      if(this->flags() & regbase::emacs_ex)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   505
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   506
         ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   507
         this->append_state(syntax_element_buffer_end);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   508
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   509
      else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   510
         result = parse_literal();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   511
      break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   512
   case regex_constants::escape_type_word_assert:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   513
      if(this->flags() & regbase::emacs_ex)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   514
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   515
         ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   516
         this->append_state(syntax_element_word_boundary);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   517
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   518
      else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   519
         result = parse_literal();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   520
      break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   521
   case regex_constants::escape_type_not_word_assert:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   522
      if(this->flags() & regbase::emacs_ex)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   523
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   524
         ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   525
         this->append_state(syntax_element_within_word);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   526
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   527
      else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   528
         result = parse_literal();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   529
      break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   530
   case regex_constants::escape_type_left_word:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   531
      if(this->flags() & regbase::emacs_ex)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   532
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   533
         ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   534
         this->append_state(syntax_element_word_start);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   535
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   536
      else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   537
         result = parse_literal();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   538
      break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   539
   case regex_constants::escape_type_right_word:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   540
      if(this->flags() & regbase::emacs_ex)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   541
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   542
         ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   543
         this->append_state(syntax_element_word_end);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   544
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   545
      else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   546
         result = parse_literal();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   547
      break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   548
   default:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   549
      if(this->flags() & regbase::emacs_ex)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   550
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   551
         bool negate = true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   552
         switch(*m_position)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   553
         {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   554
         case 'w':
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   555
            negate = false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   556
            // fall through:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   557
         case 'W':
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   558
            {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   559
            basic_char_set<charT, traits> char_set;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   560
            if(negate)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   561
               char_set.negate();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   562
            char_set.add_class(this->m_word_mask);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   563
            if(0 == this->append_set(char_set))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   564
            {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   565
               fail(regex_constants::error_ctype, m_position - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   566
               return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   567
            }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   568
            ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   569
            return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   570
            }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   571
         case 's':
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   572
            negate = false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   573
            // fall through:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   574
         case 'S':
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   575
            return add_emacs_code(negate);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   576
         case 'c':
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   577
         case 'C':
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   578
            // not supported yet:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   579
            fail(regex_constants::error_escape, m_position - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   580
            return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   581
         default:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   582
            break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   583
         }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   584
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   585
      result = parse_literal();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   586
      break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   587
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   588
   return result;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   589
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   590
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   591
template <class charT, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   592
bool basic_regex_parser<charT, traits>::parse_extended_escape()
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   593
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   594
   ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   595
   bool negate = false; // in case this is a character class escape: \w \d etc
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   596
   switch(this->m_traits.escape_syntax_type(*m_position))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   597
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   598
   case regex_constants::escape_type_not_class:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   599
      negate = true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   600
      // fall through:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   601
   case regex_constants::escape_type_class:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   602
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   603
         typedef typename traits::char_class_type mask_type;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   604
         mask_type m = this->m_traits.lookup_classname(m_position, m_position+1);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   605
         if(m != 0)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   606
         {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   607
            basic_char_set<charT, traits> char_set;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   608
            if(negate)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   609
               char_set.negate();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   610
            char_set.add_class(m);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   611
            if(0 == this->append_set(char_set))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   612
            {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   613
               fail(regex_constants::error_ctype, m_position - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   614
               return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   615
            }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   616
            ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   617
            return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   618
         }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   619
         //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   620
         // not a class, just a regular unknown escape:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   621
         //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   622
         this->append_literal(unescape_character());
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   623
         break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   624
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   625
   case regex_constants::syntax_digit:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   626
      return parse_backref();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   627
   case regex_constants::escape_type_left_word:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   628
      ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   629
      this->append_state(syntax_element_word_start);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   630
      break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   631
   case regex_constants::escape_type_right_word:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   632
      ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   633
      this->append_state(syntax_element_word_end);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   634
      break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   635
   case regex_constants::escape_type_start_buffer:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   636
      ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   637
      this->append_state(syntax_element_buffer_start);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   638
      break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   639
   case regex_constants::escape_type_end_buffer:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   640
      ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   641
      this->append_state(syntax_element_buffer_end);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   642
      break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   643
   case regex_constants::escape_type_word_assert:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   644
      ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   645
      this->append_state(syntax_element_word_boundary);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   646
      break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   647
   case regex_constants::escape_type_not_word_assert:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   648
      ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   649
      this->append_state(syntax_element_within_word);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   650
      break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   651
   case regex_constants::escape_type_Z:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   652
      ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   653
      this->append_state(syntax_element_soft_buffer_end);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   654
      break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   655
   case regex_constants::escape_type_Q:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   656
      return parse_QE();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   657
   case regex_constants::escape_type_C:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   658
      return parse_match_any();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   659
   case regex_constants::escape_type_X:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   660
      ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   661
      this->append_state(syntax_element_combining);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   662
      break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   663
   case regex_constants::escape_type_G:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   664
      ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   665
      this->append_state(syntax_element_restart_continue);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   666
      break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   667
   case regex_constants::escape_type_not_property:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   668
      negate = true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   669
      // fall through:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   670
   case regex_constants::escape_type_property:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   671
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   672
         ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   673
         char_class_type m;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   674
         if(m_position == m_end)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   675
         {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   676
            fail(regex_constants::error_escape, m_position - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   677
            return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   678
         }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   679
         // maybe have \p{ddd}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   680
         if(this->m_traits.syntax_type(*m_position) == regex_constants::syntax_open_brace)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   681
         {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   682
            const charT* base = m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   683
            // skip forward until we find enclosing brace:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   684
            while((m_position != m_end) && (this->m_traits.syntax_type(*m_position) != regex_constants::syntax_close_brace))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   685
               ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   686
            if(m_position == m_end)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   687
            {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   688
               fail(regex_constants::error_escape, m_position - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   689
               return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   690
            }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   691
            m = this->m_traits.lookup_classname(++base, m_position++);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   692
         }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   693
         else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   694
         {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   695
            m = this->m_traits.lookup_classname(m_position, m_position+1);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   696
            ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   697
         }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   698
         if(m != 0)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   699
         {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   700
            basic_char_set<charT, traits> char_set;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   701
            if(negate)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   702
               char_set.negate();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   703
            char_set.add_class(m);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   704
            if(0 == this->append_set(char_set))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   705
            {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   706
               fail(regex_constants::error_ctype, m_position - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   707
               return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   708
            }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   709
            return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   710
         }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   711
         fail(regex_constants::error_ctype, m_position - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   712
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   713
   default:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   714
      this->append_literal(unescape_character());
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   715
      break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   716
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   717
   return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   718
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   719
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   720
template <class charT, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   721
bool basic_regex_parser<charT, traits>::parse_match_any()
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   722
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   723
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   724
   // we have a '.' that can match any character:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   725
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   726
   ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   727
   static_cast<re_dot*>(
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   728
      this->append_state(syntax_element_wild, sizeof(re_dot))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   729
      )->mask = static_cast<unsigned char>(this->flags() & regbase::no_mod_s 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   730
      ? re_detail::force_not_newline 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   731
         : this->flags() & regbase::mod_s ?
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   732
            re_detail::force_newline : re_detail::dont_care);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   733
   return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   734
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   735
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   736
template <class charT, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   737
bool basic_regex_parser<charT, traits>::parse_repeat(std::size_t low, std::size_t high)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   738
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   739
   bool greedy = true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   740
   std::size_t insert_point;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   741
   // 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   742
   // when we get to here we may have a non-greedy ? mark still to come:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   743
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   744
   if((m_position != m_end) 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   745
      && (
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   746
            (0 == (this->flags() & (regbase::main_option_type | regbase::no_perl_ex)))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   747
            || ((regbase::basic_syntax_group|regbase::emacs_ex) == (this->flags() & (regbase::main_option_type | regbase::emacs_ex)))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   748
         )
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   749
      )
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   750
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   751
      // OK we have a perl regex, check for a '?':
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   752
      if(this->m_traits.syntax_type(*m_position) == regex_constants::syntax_question)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   753
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   754
         greedy = false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   755
         ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   756
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   757
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   758
   if(0 == this->m_last_state)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   759
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   760
      fail(regex_constants::error_badrepeat, ::boost::re_detail::distance(m_base, m_position));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   761
      return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   762
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   763
   if(this->m_last_state->type == syntax_element_endmark)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   764
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   765
      // insert a repeat before the '(' matching the last ')':
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   766
      insert_point = this->m_paren_start;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   767
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   768
   else if((this->m_last_state->type == syntax_element_literal) && (static_cast<re_literal*>(this->m_last_state)->length > 1))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   769
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   770
      // the last state was a literal with more than one character, split it in two:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   771
      re_literal* lit = static_cast<re_literal*>(this->m_last_state);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   772
      charT c = (static_cast<charT*>(static_cast<void*>(lit+1)))[lit->length - 1];
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   773
      --(lit->length);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   774
      // now append new state:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   775
      lit = static_cast<re_literal*>(this->append_state(syntax_element_literal, sizeof(re_literal) + sizeof(charT)));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   776
      lit->length = 1;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   777
      (static_cast<charT*>(static_cast<void*>(lit+1)))[0] = c;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   778
      insert_point = this->getoffset(this->m_last_state);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   779
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   780
   else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   781
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   782
      // repeat the last state whatever it was, need to add some error checking here:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   783
      switch(this->m_last_state->type)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   784
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   785
      case syntax_element_start_line:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   786
      case syntax_element_end_line:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   787
      case syntax_element_word_boundary:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   788
      case syntax_element_within_word:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   789
      case syntax_element_word_start:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   790
      case syntax_element_word_end:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   791
      case syntax_element_buffer_start:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   792
      case syntax_element_buffer_end:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   793
      case syntax_element_alt:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   794
      case syntax_element_soft_buffer_end:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   795
      case syntax_element_restart_continue:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   796
      case syntax_element_jump:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   797
      case syntax_element_startmark:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   798
      case syntax_element_backstep:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   799
         // can't legally repeat any of the above:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   800
         fail(regex_constants::error_badrepeat, m_position - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   801
         return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   802
      default:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   803
         // do nothing...
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   804
         break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   805
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   806
      insert_point = this->getoffset(this->m_last_state);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   807
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   808
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   809
   // OK we now know what to repeat, so insert the repeat around it:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   810
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   811
   re_repeat* rep = static_cast<re_repeat*>(this->insert_state(insert_point, syntax_element_rep, re_repeater_size));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   812
   rep->min = low;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   813
   rep->max = high;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   814
   rep->greedy = greedy;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   815
   rep->leading = false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   816
   // store our repeater position for later:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   817
   std::ptrdiff_t rep_off = this->getoffset(rep);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   818
   // and append a back jump to the repeat:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   819
   re_jump* jmp = static_cast<re_jump*>(this->append_state(syntax_element_jump, sizeof(re_jump)));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   820
   jmp->alt.i = rep_off - this->getoffset(jmp);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   821
   this->m_pdata->m_data.align();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   822
   // now fill in the alt jump for the repeat:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   823
   rep = static_cast<re_repeat*>(this->getaddress(rep_off));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   824
   rep->alt.i = this->m_pdata->m_data.size() - rep_off;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   825
   return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   826
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   827
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   828
template <class charT, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   829
bool basic_regex_parser<charT, traits>::parse_repeat_range(bool isbasic)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   830
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   831
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   832
   // parse a repeat-range:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   833
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   834
   std::size_t min, max;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   835
   int v;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   836
   // skip whitespace:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   837
   while((m_position != m_end) && this->m_traits.isctype(*m_position, this->m_mask_space))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   838
      ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   839
   // fail if at end:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   840
   if(this->m_position == this->m_end)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   841
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   842
      fail(regex_constants::error_brace, this->m_position - this->m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   843
      return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   844
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   845
   // get min:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   846
   v = this->m_traits.toi(m_position, m_end, 10);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   847
   // skip whitespace:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   848
   while((m_position != m_end) && this->m_traits.isctype(*m_position, this->m_mask_space))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   849
      ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   850
   if(v < 0)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   851
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   852
      fail(regex_constants::error_badbrace, this->m_position - this->m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   853
      return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   854
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   855
   else if(this->m_position == this->m_end)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   856
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   857
      fail(regex_constants::error_brace, this->m_position - this->m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   858
      return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   859
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   860
   min = v;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   861
   // see if we have a comma:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   862
   if(this->m_traits.syntax_type(*m_position) == regex_constants::syntax_comma)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   863
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   864
      // move on and error check:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   865
      ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   866
      // skip whitespace:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   867
      while((m_position != m_end) && this->m_traits.isctype(*m_position, this->m_mask_space))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   868
         ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   869
      if(this->m_position == this->m_end)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   870
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   871
         fail(regex_constants::error_brace, this->m_position - this->m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   872
         return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   873
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   874
      // get the value if any:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   875
      v = this->m_traits.toi(m_position, m_end, 10);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   876
      max = (v >= 0) ? v : (std::numeric_limits<std::size_t>::max)();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   877
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   878
   else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   879
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   880
      // no comma, max = min:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   881
      max = min;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   882
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   883
   // skip whitespace:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   884
   while((m_position != m_end) && this->m_traits.isctype(*m_position, this->m_mask_space))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   885
      ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   886
   // OK now check trailing }:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   887
   if(this->m_position == this->m_end)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   888
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   889
      fail(regex_constants::error_brace, this->m_position - this->m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   890
      return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   891
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   892
   if(isbasic)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   893
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   894
      if(this->m_traits.syntax_type(*m_position) == regex_constants::syntax_escape)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   895
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   896
         ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   897
         if(this->m_position == this->m_end)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   898
         {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   899
            fail(regex_constants::error_brace, this->m_position - this->m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   900
            return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   901
         }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   902
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   903
      else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   904
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   905
         fail(regex_constants::error_badbrace, this->m_position - this->m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   906
         return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   907
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   908
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   909
   if(this->m_traits.syntax_type(*m_position) == regex_constants::syntax_close_brace)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   910
      ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   911
   else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   912
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   913
      fail(regex_constants::error_badbrace, this->m_position - this->m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   914
      return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   915
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   916
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   917
   // finally go and add the repeat, unless error:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   918
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   919
   if(min > max)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   920
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   921
      fail(regex_constants::error_badbrace, this->m_position - this->m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   922
      return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   923
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   924
   return parse_repeat(min, max);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   925
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   926
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   927
template <class charT, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   928
bool basic_regex_parser<charT, traits>::parse_alt()
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   929
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   930
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   931
   // error check: if there have been no previous states,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   932
   // or if the last state was a '(' then error:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   933
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   934
   if(
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   935
      ((this->m_last_state == 0) || (this->m_last_state->type == syntax_element_startmark))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   936
      &&
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   937
      !(
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   938
         ((this->flags() & regbase::main_option_type) == regbase::perl_syntax_group)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   939
           &&
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   940
         ((this->flags() & regbase::no_empty_expressions) == 0)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   941
        )
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   942
      )
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   943
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   944
      fail(regex_constants::error_empty, this->m_position - this->m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   945
      return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   946
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   947
   ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   948
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   949
   // we need to append a trailing jump: 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   950
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   951
   re_syntax_base* pj = this->append_state(re_detail::syntax_element_jump, sizeof(re_jump));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   952
   std::ptrdiff_t jump_offset = this->getoffset(pj);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   953
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   954
   // now insert the alternative:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   955
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   956
   re_alt* palt = static_cast<re_alt*>(this->insert_state(this->m_alt_insert_point, syntax_element_alt, re_alt_size));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   957
   jump_offset += re_alt_size;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   958
   this->m_pdata->m_data.align();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   959
   palt->alt.i = this->m_pdata->m_data.size() - this->getoffset(palt);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   960
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   961
   // update m_alt_insert_point so that the next alternate gets
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   962
   // inserted at the start of the second of the two we've just created:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   963
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   964
   this->m_alt_insert_point = this->m_pdata->m_data.size();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   965
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   966
   // the start of this alternative must have a case changes state
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   967
   // if the current block has messed around with case changes:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   968
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   969
   if(m_has_case_change)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   970
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   971
      static_cast<re_case*>(
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   972
         this->append_state(syntax_element_toggle_case, sizeof(re_case))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   973
         )->icase = this->m_icase;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   974
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   975
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   976
   // push the alternative onto our stack, a recursive
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   977
   // implementation here is easier to understand (and faster
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   978
   // as it happens), but causes all kinds of stack overflow problems
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   979
   // on programs with small stacks (COM+).
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   980
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   981
   m_alt_jumps.push_back(jump_offset);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   982
   return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   983
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   984
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   985
template <class charT, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   986
bool basic_regex_parser<charT, traits>::parse_set()
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   987
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   988
   ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   989
   if(m_position == m_end)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   990
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   991
      fail(regex_constants::error_brack, m_position - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   992
      return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   993
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   994
   basic_char_set<charT, traits> char_set;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   995
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   996
   const charT* base = m_position;  // where the '[' was
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   997
   const charT* item_base = m_position;  // where the '[' or '^' was
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   998
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   999
   while(m_position != m_end)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1000
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1001
      switch(this->m_traits.syntax_type(*m_position))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1002
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1003
      case regex_constants::syntax_caret:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1004
         if(m_position == base)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1005
         {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1006
            char_set.negate();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1007
            ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1008
            item_base = m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1009
         }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1010
         else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1011
            parse_set_literal(char_set);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1012
         break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1013
      case regex_constants::syntax_close_set:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1014
         if(m_position == item_base)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1015
         {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1016
            parse_set_literal(char_set);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1017
            break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1018
         }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1019
         else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1020
         {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1021
            ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1022
            if(0 == this->append_set(char_set))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1023
            {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1024
               fail(regex_constants::error_range, m_position - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1025
               return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1026
            }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1027
         }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1028
         return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1029
      case regex_constants::syntax_open_set:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1030
         if(parse_inner_set(char_set))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1031
            break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1032
         return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1033
      case regex_constants::syntax_escape:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1034
         {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1035
            // 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1036
            // look ahead and see if this is a character class shortcut
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1037
            // \d \w \s etc...
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1038
            //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1039
            ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1040
            if(this->m_traits.escape_syntax_type(*m_position)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1041
               == regex_constants::escape_type_class)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1042
            {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1043
               char_class_type m = this->m_traits.lookup_classname(m_position, m_position+1);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1044
               if(m != 0)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1045
               {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1046
                  char_set.add_class(m);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1047
                  ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1048
                  break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1049
               }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1050
            }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1051
            else if(this->m_traits.escape_syntax_type(*m_position)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1052
               == regex_constants::escape_type_not_class)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1053
            {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1054
               // negated character class:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1055
               char_class_type m = this->m_traits.lookup_classname(m_position, m_position+1);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1056
               if(m != 0)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1057
               {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1058
                  char_set.add_negated_class(m);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1059
                  ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1060
                  break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1061
               }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1062
            }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1063
            // not a character class, just a regular escape:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1064
            --m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1065
            parse_set_literal(char_set);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1066
            break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1067
         }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1068
      default:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1069
         parse_set_literal(char_set);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1070
         break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1071
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1072
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1073
   return m_position != m_end;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1074
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1075
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1076
template <class charT, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1077
bool basic_regex_parser<charT, traits>::parse_inner_set(basic_char_set<charT, traits>& char_set)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1078
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1079
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1080
   // we have either a character class [:name:]
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1081
   // a collating element [.name.]
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1082
   // or an equivalence class [=name=]
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1083
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1084
   if(m_end == ++m_position)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1085
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1086
      fail(regex_constants::error_brack, m_position - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1087
      return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1088
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1089
   switch(this->m_traits.syntax_type(*m_position))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1090
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1091
   case regex_constants::syntax_dot:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1092
      //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1093
      // a collating element is treated as a literal:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1094
      //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1095
      --m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1096
      parse_set_literal(char_set);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1097
      return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1098
   case regex_constants::syntax_colon:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1099
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1100
      // check that character classes are actually enabled:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1101
      if((this->flags() & (regbase::main_option_type | regbase::no_char_classes)) 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1102
         == (regbase::basic_syntax_group  | regbase::no_char_classes))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1103
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1104
         --m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1105
         parse_set_literal(char_set);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1106
         return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1107
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1108
      // skip the ':'
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1109
      if(m_end == ++m_position)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1110
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1111
         fail(regex_constants::error_brack, m_position - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1112
         return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1113
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1114
      const charT* name_first = m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1115
      // skip at least one character, then find the matching ':]'
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1116
      if(m_end == ++m_position)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1117
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1118
         fail(regex_constants::error_brack, m_position - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1119
         return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1120
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1121
      while((m_position != m_end) 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1122
         && (this->m_traits.syntax_type(*m_position) != regex_constants::syntax_colon)) 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1123
         ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1124
      const charT* name_last = m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1125
      if(m_end == m_position)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1126
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1127
         fail(regex_constants::error_brack, m_position - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1128
         return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1129
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1130
      if((m_end == ++m_position) 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1131
         || (this->m_traits.syntax_type(*m_position) != regex_constants::syntax_close_set))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1132
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1133
         fail(regex_constants::error_brack, m_position - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1134
         return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1135
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1136
      //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1137
      // check for negated class:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1138
      //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1139
      bool negated = false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1140
      if(this->m_traits.syntax_type(*name_first) == regex_constants::syntax_caret)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1141
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1142
         ++name_first;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1143
         negated = true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1144
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1145
      typedef typename traits::char_class_type mask_type;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1146
      mask_type m = this->m_traits.lookup_classname(name_first, name_last);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1147
      if(m == 0)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1148
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1149
         if(char_set.empty() && (name_last - name_first == 1))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1150
         {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1151
            // maybe a special case:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1152
            ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1153
            if( (m_position != m_end) 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1154
               && (this->m_traits.syntax_type(*m_position) 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1155
                  == regex_constants::syntax_close_set))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1156
            {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1157
               if(this->m_traits.escape_syntax_type(*name_first) 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1158
                  == regex_constants::escape_type_left_word)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1159
               {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1160
                  ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1161
                  this->append_state(syntax_element_word_start);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1162
                  return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1163
               }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1164
               if(this->m_traits.escape_syntax_type(*name_first) 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1165
                  == regex_constants::escape_type_right_word)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1166
               {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1167
                  ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1168
                  this->append_state(syntax_element_word_end);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1169
                  return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1170
               }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1171
            }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1172
         }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1173
         fail(regex_constants::error_ctype, name_first - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1174
         return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1175
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1176
      if(negated == false)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1177
         char_set.add_class(m);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1178
      else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1179
         char_set.add_negated_class(m);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1180
      ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1181
      break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1182
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1183
   case regex_constants::syntax_equal:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1184
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1185
      // skip the '='
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1186
      if(m_end == ++m_position)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1187
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1188
         fail(regex_constants::error_brack, m_position - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1189
         return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1190
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1191
      const charT* name_first = m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1192
      // skip at least one character, then find the matching '=]'
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1193
      if(m_end == ++m_position)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1194
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1195
         fail(regex_constants::error_brack, m_position - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1196
         return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1197
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1198
      while((m_position != m_end) 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1199
         && (this->m_traits.syntax_type(*m_position) != regex_constants::syntax_equal)) 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1200
         ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1201
      const charT* name_last = m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1202
      if(m_end == m_position)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1203
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1204
         fail(regex_constants::error_brack, m_position - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1205
         return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1206
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1207
      if((m_end == ++m_position) 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1208
         || (this->m_traits.syntax_type(*m_position) != regex_constants::syntax_close_set))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1209
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1210
         fail(regex_constants::error_brack, m_position - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1211
         return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1212
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1213
      string_type m = this->m_traits.lookup_collatename(name_first, name_last);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1214
      if((0 == m.size()) || (m.size() > 2))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1215
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1216
         fail(regex_constants::error_collate, name_first - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1217
         return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1218
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1219
      digraph<charT> d;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1220
      d.first = m[0];
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1221
      if(m.size() > 1)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1222
         d.second = m[1];
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1223
      else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1224
         d.second = 0;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1225
      char_set.add_equivalent(d);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1226
      ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1227
      break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1228
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1229
   default:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1230
      --m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1231
      parse_set_literal(char_set);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1232
      break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1233
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1234
   return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1235
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1236
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1237
template <class charT, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1238
void basic_regex_parser<charT, traits>::parse_set_literal(basic_char_set<charT, traits>& char_set)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1239
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1240
   digraph<charT> start_range(get_next_set_literal(char_set));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1241
   if(m_end == m_position)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1242
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1243
      fail(regex_constants::error_brack, m_position - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1244
      return;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1245
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1246
   if(this->m_traits.syntax_type(*m_position) == regex_constants::syntax_dash)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1247
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1248
      // we have a range:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1249
      if(m_end == ++m_position)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1250
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1251
         fail(regex_constants::error_brack, m_position - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1252
         return;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1253
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1254
      if(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_close_set)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1255
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1256
         digraph<charT> end_range = get_next_set_literal(char_set);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1257
         char_set.add_range(start_range, end_range);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1258
         if(this->m_traits.syntax_type(*m_position) == regex_constants::syntax_dash)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1259
         {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1260
            if(m_end == ++m_position)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1261
            {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1262
               fail(regex_constants::error_brack, m_position - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1263
               return;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1264
            }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1265
            if(this->m_traits.syntax_type(*m_position) == regex_constants::syntax_close_set)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1266
            {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1267
               // trailing - :
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1268
               --m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1269
               return;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1270
            }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1271
            fail(regex_constants::error_range, m_position - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1272
            return;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1273
         }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1274
         return;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1275
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1276
      --m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1277
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1278
   char_set.add_single(start_range);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1279
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1280
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1281
template <class charT, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1282
digraph<charT> basic_regex_parser<charT, traits>::get_next_set_literal(basic_char_set<charT, traits>& char_set)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1283
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1284
   digraph<charT> result;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1285
   switch(this->m_traits.syntax_type(*m_position))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1286
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1287
   case regex_constants::syntax_dash:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1288
      if(!char_set.empty())
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1289
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1290
         // see if we are at the end of the set:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1291
         if((++m_position == m_end) || (this->m_traits.syntax_type(*m_position) != regex_constants::syntax_close_set))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1292
         {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1293
            fail(regex_constants::error_range, m_position - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1294
            return result;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1295
         }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1296
         --m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1297
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1298
      result.first = *m_position++;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1299
      return result;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1300
   case regex_constants::syntax_escape:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1301
      // check to see if escapes are supported first:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1302
      if(this->flags() & regex_constants::no_escape_in_lists)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1303
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1304
         result = *m_position++;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1305
         break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1306
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1307
      ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1308
      result = unescape_character();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1309
      break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1310
   case regex_constants::syntax_open_set:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1311
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1312
      if(m_end == ++m_position)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1313
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1314
         fail(regex_constants::error_collate, m_position - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1315
         return result;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1316
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1317
      if(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_dot)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1318
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1319
         --m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1320
         result.first = *m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1321
         ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1322
         return result;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1323
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1324
      if(m_end == ++m_position)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1325
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1326
         fail(regex_constants::error_collate, m_position - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1327
         return result;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1328
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1329
      const charT* name_first = m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1330
      // skip at least one character, then find the matching ':]'
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1331
      if(m_end == ++m_position)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1332
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1333
         fail(regex_constants::error_collate, name_first - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1334
         return result;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1335
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1336
      while((m_position != m_end) 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1337
         && (this->m_traits.syntax_type(*m_position) != regex_constants::syntax_dot)) 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1338
         ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1339
      const charT* name_last = m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1340
      if(m_end == m_position)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1341
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1342
         fail(regex_constants::error_collate, name_first - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1343
         return result;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1344
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1345
      if((m_end == ++m_position) 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1346
         || (this->m_traits.syntax_type(*m_position) != regex_constants::syntax_close_set))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1347
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1348
         fail(regex_constants::error_collate, name_first - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1349
         return result;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1350
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1351
      ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1352
      string_type s = this->m_traits.lookup_collatename(name_first, name_last);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1353
      if(s.empty() || (s.size() > 2))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1354
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1355
         fail(regex_constants::error_collate, name_first - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1356
         return result;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1357
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1358
      result.first = s[0];
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1359
      if(s.size() > 1)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1360
         result.second = s[1];
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1361
      else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1362
         result.second = 0;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1363
      return result;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1364
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1365
   default:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1366
      result = *m_position++;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1367
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1368
   return result;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1369
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1370
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1371
//
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1372
// does a value fit in the specified charT type?
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1373
//
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1374
template <class charT>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1375
bool valid_value(charT, int v, const mpl::true_&)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1376
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1377
   return (v >> (sizeof(charT) * CHAR_BIT)) == 0;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1378
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1379
template <class charT>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1380
bool valid_value(charT, int, const mpl::false_&)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1381
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1382
   return true; // v will alsways fit in a charT
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1383
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1384
template <class charT>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1385
bool valid_value(charT c, int v)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1386
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1387
   return valid_value(c, v, mpl::bool_<(sizeof(charT) < sizeof(int))>());
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1388
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1389
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1390
template <class charT, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1391
charT basic_regex_parser<charT, traits>::unescape_character()
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1392
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1393
#ifdef BOOST_MSVC
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1394
#pragma warning(push)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1395
#pragma warning(disable:4127)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1396
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1397
   charT result(0);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1398
   if(m_position == m_end)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1399
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1400
      fail(regex_constants::error_escape, m_position - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1401
      return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1402
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1403
   switch(this->m_traits.escape_syntax_type(*m_position))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1404
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1405
   case regex_constants::escape_type_control_a:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1406
      result = charT('\a');
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1407
      break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1408
   case regex_constants::escape_type_e:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1409
      result = charT(27);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1410
      break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1411
   case regex_constants::escape_type_control_f:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1412
      result = charT('\f');
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1413
      break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1414
   case regex_constants::escape_type_control_n:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1415
      result = charT('\n');
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1416
      break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1417
   case regex_constants::escape_type_control_r:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1418
      result = charT('\r');
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1419
      break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1420
   case regex_constants::escape_type_control_t:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1421
      result = charT('\t');
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1422
      break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1423
   case regex_constants::escape_type_control_v:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1424
      result = charT('\v');
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1425
      break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1426
   case regex_constants::escape_type_word_assert:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1427
      result = charT('\b');
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1428
      break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1429
   case regex_constants::escape_type_ascii_control:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1430
      ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1431
      if(m_position == m_end)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1432
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1433
         fail(regex_constants::error_escape, m_position - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1434
         return result;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1435
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1436
      /*
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1437
      if((*m_position < charT('@'))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1438
            || (*m_position > charT(125)) )
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1439
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1440
         fail(regex_constants::error_escape, m_position - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1441
         return result;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1442
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1443
      */
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1444
      result = static_cast<charT>(*m_position % 32);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1445
      break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1446
   case regex_constants::escape_type_hex:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1447
      ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1448
      if(m_position == m_end)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1449
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1450
         fail(regex_constants::error_escape, m_position - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1451
         return result;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1452
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1453
      // maybe have \x{ddd}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1454
      if(this->m_traits.syntax_type(*m_position) == regex_constants::syntax_open_brace)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1455
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1456
         ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1457
         if(m_position == m_end)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1458
         {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1459
            fail(regex_constants::error_escape, m_position - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1460
            return result;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1461
         }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1462
         int i = this->m_traits.toi(m_position, m_end, 16);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1463
         if((m_position == m_end)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1464
            || (i < 0)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1465
            || ((std::numeric_limits<charT>::is_specialized) && (charT(i) > (std::numeric_limits<charT>::max)()))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1466
            || (this->m_traits.syntax_type(*m_position) != regex_constants::syntax_close_brace))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1467
         {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1468
            fail(regex_constants::error_badbrace, m_position - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1469
            return result;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1470
         }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1471
         ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1472
         result = charT(i);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1473
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1474
      else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1475
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1476
         std::ptrdiff_t len = (std::min)(static_cast<std::ptrdiff_t>(2), m_end - m_position);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1477
         int i = this->m_traits.toi(m_position, m_position + len, 16);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1478
         if((i < 0)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1479
            || !valid_value(charT(0), i))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1480
         {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1481
            fail(regex_constants::error_escape, m_position - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1482
            return result;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1483
         }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1484
         result = charT(i);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1485
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1486
      return result;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1487
   case regex_constants::syntax_digit:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1488
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1489
      // an octal escape sequence, the first character must be a zero
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1490
      // followed by up to 3 octal digits:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1491
      std::ptrdiff_t len = (std::min)(::boost::re_detail::distance(m_position, m_end), static_cast<std::ptrdiff_t>(4));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1492
      const charT* bp = m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1493
      int val = this->m_traits.toi(bp, bp + 1, 8);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1494
      if(val != 0)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1495
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1496
         // Oops not an octal escape after all:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1497
         fail(regex_constants::error_escape, m_position - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1498
         return result;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1499
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1500
      val = this->m_traits.toi(m_position, m_position + len, 8);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1501
      if(val < 0) 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1502
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1503
         fail(regex_constants::error_escape, m_position - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1504
         return result;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1505
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1506
      return static_cast<charT>(val);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1507
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1508
   case regex_constants::escape_type_named_char:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1509
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1510
         ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1511
         if(m_position == m_end)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1512
         {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1513
            fail(regex_constants::error_escape, m_position - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1514
            return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1515
         }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1516
         // maybe have \N{name}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1517
         if(this->m_traits.syntax_type(*m_position) == regex_constants::syntax_open_brace)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1518
         {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1519
            const charT* base = m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1520
            // skip forward until we find enclosing brace:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1521
            while((m_position != m_end) && (this->m_traits.syntax_type(*m_position) != regex_constants::syntax_close_brace))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1522
               ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1523
            if(m_position == m_end)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1524
            {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1525
               fail(regex_constants::error_escape, m_position - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1526
               return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1527
            }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1528
            string_type s = this->m_traits.lookup_collatename(++base, m_position++);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1529
            if(s.empty())
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1530
            {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1531
               fail(regex_constants::error_collate, m_position - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1532
               return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1533
            }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1534
            if(s.size() == 1)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1535
            {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1536
               return s[0];
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1537
            }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1538
         }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1539
         // fall through is a failure:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1540
         fail(regex_constants::error_escape, m_position - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1541
         return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1542
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1543
   default:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1544
      result = *m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1545
      break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1546
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1547
   ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1548
   return result;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1549
#ifdef BOOST_MSVC
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1550
#pragma warning(pop)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1551
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1552
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1553
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1554
template <class charT, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1555
bool basic_regex_parser<charT, traits>::parse_backref()
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1556
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1557
   BOOST_ASSERT(m_position != m_end);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1558
   const charT* pc = m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1559
   int i = this->m_traits.toi(pc, pc + 1, 10);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1560
   if((i == 0) || (((this->flags() & regbase::main_option_type) == regbase::perl_syntax_group) && (this->flags() & regbase::no_bk_refs)))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1561
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1562
      // not a backref at all but an octal escape sequence:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1563
      charT c = unescape_character();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1564
      this->append_literal(c);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1565
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1566
   else if((i > 0) && (this->m_backrefs & (1u << (i-1))))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1567
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1568
      m_position = pc;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1569
      re_brace* pb = static_cast<re_brace*>(this->append_state(syntax_element_backref, sizeof(re_brace)));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1570
      pb->index = i;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1571
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1572
   else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1573
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1574
      fail(regex_constants::error_backref, m_position - m_end);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1575
      return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1576
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1577
   return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1578
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1579
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1580
template <class charT, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1581
bool basic_regex_parser<charT, traits>::parse_QE()
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1582
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1583
#ifdef BOOST_MSVC
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1584
#pragma warning(push)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1585
#pragma warning(disable:4127)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1586
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1587
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1588
   // parse a \Q...\E sequence:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1589
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1590
   ++m_position; // skip the Q
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1591
   const charT* start = m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1592
   const charT* end;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1593
   do
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1594
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1595
      while((m_position != m_end) 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1596
         && (this->m_traits.syntax_type(*m_position) != regex_constants::syntax_escape))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1597
         ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1598
      if(m_position == m_end)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1599
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1600
         //  a \Q...\E sequence may terminate with the end of the expression:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1601
         end = m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1602
         break;  
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1603
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1604
      if(++m_position == m_end) // skip the escape
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1605
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1606
         fail(regex_constants::error_escape, m_position - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1607
         return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1608
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1609
      // check to see if it's a \E:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1610
      if(this->m_traits.escape_syntax_type(*m_position) == regex_constants::escape_type_E)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1611
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1612
         ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1613
         end = m_position - 2;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1614
         break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1615
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1616
      // otherwise go round again:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1617
   }while(true);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1618
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1619
   // now add all the character between the two escapes as literals:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1620
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1621
   while(start != end)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1622
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1623
      this->append_literal(*start);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1624
      ++start;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1625
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1626
   return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1627
#ifdef BOOST_MSVC
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1628
#pragma warning(pop)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1629
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1630
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1631
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1632
template <class charT, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1633
bool basic_regex_parser<charT, traits>::parse_perl_extension()
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1634
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1635
   if(++m_position == m_end)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1636
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1637
      fail(regex_constants::error_badrepeat, m_position - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1638
      return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1639
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1640
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1641
   // treat comments as a special case, as these
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1642
   // are the only ones that don't start with a leading
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1643
   // startmark state:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1644
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1645
   if(this->m_traits.syntax_type(*m_position) == regex_constants::syntax_hash)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1646
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1647
      while((m_position != m_end) 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1648
         && (this->m_traits.syntax_type(*m_position++) != regex_constants::syntax_close_mark))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1649
      {}      
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1650
      return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1651
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1652
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1653
   // backup some state, and prepare the way:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1654
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1655
   int markid = 0;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1656
   std::ptrdiff_t jump_offset = 0;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1657
   re_brace* pb = static_cast<re_brace*>(this->append_state(syntax_element_startmark, sizeof(re_brace)));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1658
   std::ptrdiff_t last_paren_start = this->getoffset(pb);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1659
   // back up insertion point for alternations, and set new point:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1660
   std::ptrdiff_t last_alt_point = m_alt_insert_point;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1661
   this->m_pdata->m_data.align();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1662
   m_alt_insert_point = this->m_pdata->m_data.size();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1663
   std::ptrdiff_t expected_alt_point = m_alt_insert_point;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1664
   bool restore_flags = true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1665
   regex_constants::syntax_option_type old_flags = this->flags();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1666
   bool old_case_change = m_has_case_change;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1667
   m_has_case_change = false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1668
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1669
   // select the actual extension used:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1670
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1671
   switch(this->m_traits.syntax_type(*m_position))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1672
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1673
   case regex_constants::syntax_colon:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1674
      //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1675
      // a non-capturing mark:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1676
      //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1677
      pb->index = markid = 0;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1678
      ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1679
      break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1680
   case regex_constants::syntax_equal:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1681
      pb->index = markid = -1;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1682
      ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1683
      jump_offset = this->getoffset(this->append_state(syntax_element_jump, sizeof(re_jump)));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1684
      this->m_pdata->m_data.align();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1685
      m_alt_insert_point = this->m_pdata->m_data.size();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1686
      break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1687
   case regex_constants::syntax_not:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1688
      pb->index = markid = -2;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1689
      ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1690
      jump_offset = this->getoffset(this->append_state(syntax_element_jump, sizeof(re_jump)));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1691
      this->m_pdata->m_data.align();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1692
      m_alt_insert_point = this->m_pdata->m_data.size();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1693
      break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1694
   case regex_constants::escape_type_left_word:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1695
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1696
         // a lookbehind assertion:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1697
         if(++m_position == m_end)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1698
         {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1699
            fail(regex_constants::error_badrepeat, m_position - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1700
            return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1701
         }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1702
         regex_constants::syntax_type t = this->m_traits.syntax_type(*m_position);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1703
         if(t == regex_constants::syntax_not)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1704
            pb->index = markid = -2;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1705
         else if(t == regex_constants::syntax_equal)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1706
            pb->index = markid = -1;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1707
         else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1708
         {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1709
            fail(regex_constants::error_badrepeat, m_position - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1710
            return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1711
         }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1712
         ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1713
         jump_offset = this->getoffset(this->append_state(syntax_element_jump, sizeof(re_jump)));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1714
         this->append_state(syntax_element_backstep, sizeof(re_brace));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1715
         this->m_pdata->m_data.align();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1716
         m_alt_insert_point = this->m_pdata->m_data.size();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1717
         break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1718
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1719
   case regex_constants::escape_type_right_word:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1720
      //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1721
      // an independent sub-expression:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1722
      //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1723
      pb->index = markid = -3;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1724
      ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1725
      jump_offset = this->getoffset(this->append_state(syntax_element_jump, sizeof(re_jump)));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1726
      this->m_pdata->m_data.align();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1727
      m_alt_insert_point = this->m_pdata->m_data.size();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1728
      break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1729
   case regex_constants::syntax_open_mark:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1730
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1731
      // a conditional expression:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1732
      pb->index = markid = -4;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1733
      if(++m_position == m_end)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1734
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1735
         fail(regex_constants::error_badrepeat, m_position - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1736
         return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1737
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1738
      int v = this->m_traits.toi(m_position, m_end, 10);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1739
      if(v > 0)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1740
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1741
         re_brace* br = static_cast<re_brace*>(this->append_state(syntax_element_assert_backref, sizeof(re_brace)));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1742
         br->index = v;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1743
         if(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_close_mark)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1744
         {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1745
            fail(regex_constants::error_badrepeat, m_position - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1746
            return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1747
         }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1748
         if(++m_position == m_end)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1749
         {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1750
            fail(regex_constants::error_badrepeat, m_position - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1751
            return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1752
         }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1753
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1754
      else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1755
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1756
         // verify that we have a lookahead or lookbehind assert:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1757
         if(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_question)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1758
         {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1759
            fail(regex_constants::error_badrepeat, m_position - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1760
            return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1761
         }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1762
         if(++m_position == m_end)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1763
         {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1764
            fail(regex_constants::error_badrepeat, m_position - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1765
            return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1766
         }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1767
         if(this->m_traits.syntax_type(*m_position) == regex_constants::escape_type_left_word)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1768
         {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1769
            if(++m_position == m_end)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1770
            {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1771
               fail(regex_constants::error_badrepeat, m_position - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1772
               return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1773
            }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1774
            if((this->m_traits.syntax_type(*m_position) != regex_constants::syntax_equal)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1775
               && (this->m_traits.syntax_type(*m_position) != regex_constants::syntax_not))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1776
            {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1777
               fail(regex_constants::error_badrepeat, m_position - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1778
               return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1779
            }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1780
            m_position -= 3;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1781
         }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1782
         else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1783
         {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1784
            if((this->m_traits.syntax_type(*m_position) != regex_constants::syntax_equal)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1785
               && (this->m_traits.syntax_type(*m_position) != regex_constants::syntax_not))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1786
            {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1787
               fail(regex_constants::error_badrepeat, m_position - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1788
               return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1789
            }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1790
            m_position -= 2;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1791
         }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1792
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1793
      break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1794
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1795
   case regex_constants::syntax_close_mark:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1796
      fail(regex_constants::error_badrepeat, m_position - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1797
      return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1798
   default:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1799
      //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1800
      // lets assume that we have a (?imsx) group and try and parse it:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1801
      //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1802
      regex_constants::syntax_option_type opts = parse_options();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1803
      if(m_position == m_end)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1804
         return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1805
      // make a note of whether we have a case change:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1806
      m_has_case_change = ((opts & regbase::icase) != (this->flags() & regbase::icase));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1807
      pb->index = markid = 0;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1808
      if(this->m_traits.syntax_type(*m_position) == regex_constants::syntax_close_mark)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1809
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1810
         // update flags and carry on as normal:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1811
         this->flags(opts);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1812
         restore_flags = false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1813
         old_case_change |= m_has_case_change; // defer end of scope by one ')'
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1814
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1815
      else if(this->m_traits.syntax_type(*m_position) == regex_constants::syntax_colon)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1816
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1817
         // update flags and carry on until the matching ')' is found:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1818
         this->flags(opts);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1819
         ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1820
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1821
      else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1822
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1823
         fail(regex_constants::error_badrepeat, m_position - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1824
         return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1825
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1826
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1827
      // finally append a case change state if we need it:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1828
      if(m_has_case_change)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1829
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1830
         static_cast<re_case*>(
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1831
            this->append_state(syntax_element_toggle_case, sizeof(re_case))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1832
            )->icase = opts & regbase::icase;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1833
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1834
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1835
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1836
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1837
   // now recursively add more states, this will terminate when we get to a
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1838
   // matching ')' :
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1839
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1840
   parse_all();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1841
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1842
   // Unwind alternatives:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1843
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1844
   if(0 == unwind_alts(last_paren_start))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1845
      return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1846
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1847
   // we either have a ')' or we have run out of characters prematurely:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1848
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1849
   if(m_position == m_end)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1850
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1851
      this->fail(regex_constants::error_paren, ::boost::re_detail::distance(m_base, m_end));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1852
      return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1853
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1854
   BOOST_ASSERT(this->m_traits.syntax_type(*m_position) == regex_constants::syntax_close_mark);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1855
   ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1856
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1857
   // restore the flags:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1858
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1859
   if(restore_flags)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1860
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1861
      // append a case change state if we need it:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1862
      if(m_has_case_change)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1863
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1864
         static_cast<re_case*>(
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1865
            this->append_state(syntax_element_toggle_case, sizeof(re_case))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1866
            )->icase = old_flags & regbase::icase;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1867
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1868
      this->flags(old_flags);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1869
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1870
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1871
   // set up the jump pointer if we have one:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1872
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1873
   if(jump_offset)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1874
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1875
      this->m_pdata->m_data.align();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1876
      re_jump* jmp = static_cast<re_jump*>(this->getaddress(jump_offset));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1877
      jmp->alt.i = this->m_pdata->m_data.size() - this->getoffset(jmp);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1878
      if(this->m_last_state == jmp)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1879
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1880
         // Oops... we didn't have anything inside the assertion:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1881
         fail(regex_constants::error_empty, m_position - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1882
         return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1883
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1884
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1885
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1886
   // verify that if this is conditional expression, that we do have
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1887
   // an alternative, if not add one:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1888
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1889
   if(markid == -4)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1890
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1891
      re_syntax_base* b = this->getaddress(expected_alt_point);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1892
      // Make sure we have exactly one alternative following this state:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1893
      if(b->type != syntax_element_alt)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1894
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1895
         re_alt* alt = static_cast<re_alt*>(this->insert_state(expected_alt_point, syntax_element_alt, sizeof(re_alt)));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1896
         alt->alt.i = this->m_pdata->m_data.size() - this->getoffset(alt);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1897
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1898
      else if(this->getaddress(static_cast<re_alt*>(b)->alt.i, b)->type == syntax_element_alt)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1899
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1900
         fail(regex_constants::error_bad_pattern, m_position - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1901
         return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1902
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1903
      // check for invalid repetition of next state:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1904
      b = this->getaddress(expected_alt_point);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1905
      b = this->getaddress(static_cast<re_alt*>(b)->next.i, b);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1906
      if((b->type != syntax_element_assert_backref)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1907
         && (b->type != syntax_element_startmark))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1908
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1909
         fail(regex_constants::error_badrepeat, m_position - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1910
         return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1911
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1912
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1913
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1914
   // append closing parenthesis state:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1915
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1916
   pb = static_cast<re_brace*>(this->append_state(syntax_element_endmark, sizeof(re_brace)));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1917
   pb->index = markid;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1918
   this->m_paren_start = last_paren_start;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1919
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1920
   // restore the alternate insertion point:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1921
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1922
   this->m_alt_insert_point = last_alt_point;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1923
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1924
   // and the case change data:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1925
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1926
   m_has_case_change = old_case_change;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1927
   return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1928
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1929
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1930
template <class charT, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1931
bool basic_regex_parser<charT, traits>::add_emacs_code(bool negate)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1932
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1933
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1934
   // parses an emacs style \sx or \Sx construct.
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1935
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1936
   if(++m_position == m_end)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1937
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1938
      fail(regex_constants::error_escape, m_position - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1939
      return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1940
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1941
   basic_char_set<charT, traits> char_set;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1942
   if(negate)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1943
      char_set.negate();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1944
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1945
   static const charT s_punct[5] = { 'p', 'u', 'n', 'c', 't', };
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1946
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1947
   switch(*m_position)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1948
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1949
   case 's':
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1950
   case ' ':
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1951
      char_set.add_class(this->m_mask_space);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1952
      break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1953
   case 'w':
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1954
      char_set.add_class(this->m_word_mask);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1955
      break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1956
   case '_':
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1957
      char_set.add_single(digraph<charT>(charT('$'))); 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1958
      char_set.add_single(digraph<charT>(charT('&'))); 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1959
      char_set.add_single(digraph<charT>(charT('*'))); 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1960
      char_set.add_single(digraph<charT>(charT('+'))); 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1961
      char_set.add_single(digraph<charT>(charT('-'))); 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1962
      char_set.add_single(digraph<charT>(charT('_'))); 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1963
      char_set.add_single(digraph<charT>(charT('<'))); 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1964
      char_set.add_single(digraph<charT>(charT('>'))); 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1965
      break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1966
   case '.':
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1967
      char_set.add_class(this->m_traits.lookup_classname(s_punct, s_punct+5));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1968
      break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1969
   case '(':
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1970
      char_set.add_single(digraph<charT>(charT('('))); 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1971
      char_set.add_single(digraph<charT>(charT('['))); 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1972
      char_set.add_single(digraph<charT>(charT('{'))); 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1973
      break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1974
   case ')':
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1975
      char_set.add_single(digraph<charT>(charT(')'))); 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1976
      char_set.add_single(digraph<charT>(charT(']'))); 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1977
      char_set.add_single(digraph<charT>(charT('}'))); 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1978
      break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1979
   case '"':
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1980
      char_set.add_single(digraph<charT>(charT('"'))); 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1981
      char_set.add_single(digraph<charT>(charT('\''))); 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1982
      char_set.add_single(digraph<charT>(charT('`'))); 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1983
      break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1984
   case '\'':
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1985
      char_set.add_single(digraph<charT>(charT('\''))); 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1986
      char_set.add_single(digraph<charT>(charT(','))); 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1987
      char_set.add_single(digraph<charT>(charT('#'))); 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1988
      break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1989
   case '<':
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1990
      char_set.add_single(digraph<charT>(charT(';'))); 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1991
      break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1992
   case '>':
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1993
      char_set.add_single(digraph<charT>(charT('\n'))); 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1994
      char_set.add_single(digraph<charT>(charT('\f'))); 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1995
      break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1996
   default:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1997
      fail(regex_constants::error_ctype, m_position - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1998
      return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1999
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2000
   if(0 == this->append_set(char_set))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2001
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2002
      fail(regex_constants::error_ctype, m_position - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2003
      return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2004
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2005
   ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2006
   return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2007
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2008
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2009
template <class charT, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2010
regex_constants::syntax_option_type basic_regex_parser<charT, traits>::parse_options()
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2011
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2012
   // we have a (?imsx-imsx) group, convert it into a set of flags:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2013
   regex_constants::syntax_option_type f = this->flags();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2014
   bool breakout = false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2015
   do
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2016
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2017
      switch(*m_position)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2018
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2019
      case 's':
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2020
         f |= regex_constants::mod_s;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2021
         f &= ~regex_constants::no_mod_s;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2022
         break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2023
      case 'm':
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2024
         f &= ~regex_constants::no_mod_m;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2025
         break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2026
      case 'i':
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2027
         f |= regex_constants::icase;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2028
         break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2029
      case 'x':
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2030
         f |= regex_constants::mod_x;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2031
         break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2032
      default:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2033
         breakout = true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2034
         continue;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2035
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2036
      if(++m_position == m_end)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2037
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2038
         fail(regex_constants::error_paren, m_position - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2039
         return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2040
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2041
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2042
   while(!breakout);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2043
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2044
   if(*m_position == static_cast<charT>('-'))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2045
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2046
      if(++m_position == m_end)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2047
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2048
         fail(regex_constants::error_paren, m_position - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2049
         return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2050
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2051
      do
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2052
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2053
         switch(*m_position)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2054
         {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2055
         case 's':
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2056
            f &= ~regex_constants::mod_s;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2057
            f |= regex_constants::no_mod_s;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2058
            break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2059
         case 'm':
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2060
            f |= regex_constants::no_mod_m;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2061
            break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2062
         case 'i':
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2063
            f &= ~regex_constants::icase;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2064
            break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2065
         case 'x':
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2066
            f &= ~regex_constants::mod_x;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2067
            break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2068
         default:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2069
            breakout = true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2070
            continue;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2071
         }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2072
         if(++m_position == m_end)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2073
         {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2074
            fail(regex_constants::error_paren, m_position - m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2075
            return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2076
         }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2077
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2078
      while(!breakout);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2079
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2080
   return f;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2081
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2082
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2083
template <class charT, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2084
bool basic_regex_parser<charT, traits>::unwind_alts(std::ptrdiff_t last_paren_start)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2085
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2086
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2087
   // If we didn't actually add any states after the last 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2088
   // alternative then that's an error:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2089
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2090
   if((this->m_alt_insert_point == static_cast<std::ptrdiff_t>(this->m_pdata->m_data.size()))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2091
      && m_alt_jumps.size() && (m_alt_jumps.back() > last_paren_start)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2092
      &&
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2093
      !(
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2094
         ((this->flags() & regbase::main_option_type) == regbase::perl_syntax_group)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2095
           &&
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2096
         ((this->flags() & regbase::no_empty_expressions) == 0)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2097
        )
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2098
      )
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2099
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2100
      fail(regex_constants::error_empty, this->m_position - this->m_base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2101
      return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2102
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2103
   // 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2104
   // Fix up our alternatives:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2105
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2106
   while(m_alt_jumps.size() && (m_alt_jumps.back() > last_paren_start))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2107
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2108
      //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2109
      // fix up the jump to point to the end of the states
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2110
      // that we've just added:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2111
      //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2112
      std::ptrdiff_t jump_offset = m_alt_jumps.back();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2113
      m_alt_jumps.pop_back();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2114
      this->m_pdata->m_data.align();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2115
      re_jump* jmp = static_cast<re_jump*>(this->getaddress(jump_offset));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2116
      BOOST_ASSERT(jmp->type == syntax_element_jump);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2117
      jmp->alt.i = this->m_pdata->m_data.size() - jump_offset;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2118
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2119
   return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2120
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2121
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2122
#ifdef BOOST_MSVC
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2123
#pragma warning(pop)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2124
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2125
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2126
} // namespace re_detail
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2127
} // namespace boost
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2128
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2129
#ifdef BOOST_MSVC
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2130
#pragma warning(push)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2131
#pragma warning(disable: 4103)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2132
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2133
#ifdef BOOST_HAS_ABI_HEADERS
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2134
#  include BOOST_ABI_SUFFIX
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2135
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2136
#ifdef BOOST_MSVC
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2137
#pragma warning(pop)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2138
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2139
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  2140
#endif