STLdoc
STLdocumentation
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
Public Types | Public Member Functions | Private Member Functions | Private Attributes | List of all members
_Parser< _FwdIt, _Elem, _RxTraits > Class Template Reference

Public Types

typedef _RxTraits::char_class_type char_class_type
 

Public Member Functions

 _Parser (const _RxTraits &_Tr, _FwdIt _Pfirst, _FwdIt _Plast, regex_constants::syntax_option_type _Fx)
 
_Root_node_Compile ()
 
unsigned int _Mark_count () const
 

Private Member Functions

void _Error (regex_constants::error_type)
 
bool _Is_esc () const
 
void _Trans ()
 
void _Next ()
 
void _Expect (_Meta_type, regex_constants::error_type)
 
int _Do_digits (int _Base, int _Count)
 
bool _DecimalDigits ()
 
void _HexDigits (int)
 
bool _OctalDigits ()
 
void _Do_ex_class (_Meta_type)
 
bool _CharacterClassEscape (bool)
 
_Prs_ret _ClassEscape (bool)
 
_Prs_ret _ClassAtom ()
 
void _ClassRanges ()
 
void _CharacterClass ()
 
bool _IdentityEscape ()
 
bool _IsIdentityEscape () const
 
bool _Do_ffn (_Elem)
 
bool _Do_ffnx (_Elem)
 
bool _CharacterEscape ()
 
void _AtomEscape ()
 
void _Do_capture_group ()
 
void _Do_noncapture_group ()
 
void _Do_assert_group (bool)
 
bool _Wrapped_disjunction ()
 
void _Quantifier ()
 
bool _Alternative ()
 
void _Disjunction ()
 

Private Attributes

_FwdIt _Pat
 
_FwdIt _Begin
 
_FwdIt _End
 
int _Grp_idx
 
int _Disj_count
 
vector< bool_Finished_grps
 
_Builder< _FwdIt, _Elem, _RxTraits > _Nfa
 
const _RxTraits & _Traits
 
regex_constants::syntax_option_type _Flags
 
int _Val
 
_Elem _Char
 
_Meta_type _Mchar
 
unsigned int _L_flags
 

Member Typedef Documentation

template<class _FwdIt , class _Elem , class _RxTraits >
typedef _RxTraits::char_class_type _Parser< _FwdIt, _Elem, _RxTraits >::char_class_type

Constructor & Destructor Documentation

template<class _FwdIt , class _Elem , class _RxTraits >
_Parser< _FwdIt, _Elem, _RxTraits >::_Parser ( const _RxTraits &  _Tr,
_FwdIt  _Pfirst,
_FwdIt  _Plast,
regex_constants::syntax_option_type  _Fx 
)
inline
5730  _Grp_idx(0), _Disj_count(0), _Finished_grps(0),
5731  _Nfa(_Tr, _Fx), _Traits(_Tr), _Flags(_Fx)
5732  { // construct
5733 
5734  // PARSER LANGUAGE FLAGS
5735  constexpr unsigned int _ECMA_flags =
5740  | _L_empty_grp;
5741 
5742  constexpr unsigned int _Basic_flags =
5745 
5746  constexpr unsigned int _Grep_flags =
5747  _Basic_flags | _L_alt_nl | _L_no_nl;
5748 
5749  constexpr unsigned int _Extended_flags =
5752 
5753  constexpr unsigned int _Awk_flags =
5754  _Extended_flags | _L_esc_oct | _L_esc_ffn | _L_esc_ffnx | _L_ident_awk;
5755 
5756  constexpr unsigned int _Egrep_flags =
5757  _Extended_flags | _L_alt_nl | _L_no_nl;
5758 
5759  using namespace regex_constants;
5760  _L_flags = (_Flags & _Gmask) == ECMAScript
5761  || (_Flags & _Gmask) == 0 ? _ECMA_flags
5762  : (_Flags & _Gmask) == basic ? _Basic_flags
5763  : (_Flags & _Gmask) == extended ? _Extended_flags
5764  : (_Flags & _Gmask) == awk ? _Awk_flags
5765  : (_Flags & _Gmask) == grep ? _Grep_flags
5766  : (_Flags & _Gmask) == egrep ? _Egrep_flags
5767  : 0;
5768  if (_L_flags & _L_mtch_long)
5769  _Nfa._Setlong();
5770  _Trans();
5771  }
Definition: regex:2211
Definition: regex:2236
_Builder< _FwdIt, _Elem, _RxTraits > _Nfa
Definition: regex:2196
Definition: regex:2232
Definition: regex:96
Definition: regex:2227
Definition: regex:2221
Definition: regex:2233
Definition: regex:2218
_FwdIt _Begin
Definition: regex:2191
_RanIt _Plast
Definition: algorithm:2577
Definition: regex:2220
Definition: regex:104
Definition: regex:101
regex_constants::syntax_option_type _Flags
Definition: regex:2198
_FwdIt _End
Definition: regex:2192
Definition: regex:2225
Definition: regex:2214
_RanIt _Pfirst
Definition: algorithm:2576
Definition: regex:2223
Definition: regex:2229
Definition: regex:106
Definition: regex:2228
Definition: regex:2215
const _RxTraits & _Traits
Definition: regex:2197
Definition: regex:2230
Definition: regex:100
Definition: regex:103
Definition: regex:2234
Definition: regex:2237
Definition: regex:2222
Definition: regex:2216
void _Trans()
Definition: regex:4905
Definition: regex:102
Definition: regex:2219
Definition: regex:2207
vector< bool > _Finished_grps
Definition: regex:2195
Definition: regex:2213
Definition: regex:2231
Definition: regex:2212
_FwdIt _Pat
Definition: regex:2190
Definition: regex:105
int _Grp_idx
Definition: regex:2193
Definition: regex:2226
Definition: regex:2210
Definition: regex:2224
Definition: regex:2217
unsigned int _L_flags
Definition: regex:2202
Definition: regex:2235
int _Disj_count
Definition: regex:2194
Definition: regex:2209
Definition: regex:2208

Member Function Documentation

template<class _FwdIt , class _Elem , class _RxTraits >
bool _Parser< _FwdIt, _Elem, _RxTraits >::_Alternative ( )
inlineprivate
5545  { // check for valid alternative
5546  bool _Found = false;
5547  for (; ; )
5548  { // concatenate valid elements
5549  bool _Quant = true;
5550  if (_Mchar == _Meta_eos || _Mchar == _Meta_bar
5551  || (_Mchar == _Meta_rpar && _Disj_count != 0))
5552  return (_Found);
5553  else if (_Mchar == _Meta_rpar && !(_L_flags & _L_paren_bal))
5555  else if (_Mchar == _Meta_dot)
5556  { // add dot node
5557  _Nfa._Add_dot();
5558  _Next();
5559  }
5560  else if (_Mchar == _Meta_esc)
5561  { // check for valid escape sequence
5562  _Next();
5563  if ((_L_flags & _L_asrt_wrd) && _Char == _Esc_word)
5564  { // add word assert
5565  _Nfa._Add_wbound();
5566  _Next();
5567  _Quant = false;
5568  }
5569  else if ((_L_flags & _L_asrt_wrd) && _Char == _Esc_not_word)
5570  { // add not-word assert
5571  _Nfa._Add_wbound();
5572  _Nfa._Negate();
5573  _Next();
5574  _Quant = false;
5575  }
5576  else
5577  _AtomEscape();
5578  }
5579  else if (_Mchar == _Meta_lsq)
5580  { // add bracket expression
5581  _Next();
5582  _CharacterClass();
5584  }
5585  else if (_Mchar == _Meta_lpar)
5586  { // check for valid group
5587  _Next();
5588  _Quant = _Wrapped_disjunction();
5590  }
5591  else if (_Mchar == _Meta_caret)
5592  { // add bol node
5593  _Nfa._Add_bol();
5594  _Next();
5595  _Quant = false;
5596  }
5597  else if (_Mchar == _Meta_dlr)
5598  { // add eol node
5599  _Nfa._Add_eol();
5600  _Next();
5601  _Quant = false;
5602  }
5603  else if (_Mchar == _Meta_star
5604  || _Mchar == _Meta_plus
5605  || _Mchar == _Meta_query
5606  || _Mchar == _Meta_lbr)
5608  else if (_Mchar == _Meta_rbr && !(_L_flags & _L_paren_bal))
5610  else if (_Mchar == _Meta_rsq && !(_L_flags & _L_paren_bal))
5612  else
5613  { // add character
5614  _Nfa._Add_char(_Char);
5615  _Next();
5616  }
5617  if (_Quant)
5618  _Quantifier();
5619  _Found = true;
5620  }
5621  }
_Builder< _FwdIt, _Elem, _RxTraits > _Nfa
Definition: regex:2196
_Meta_type _Mchar
Definition: regex:2201
Definition: regex:74
void _AtomEscape()
Definition: regex:5469
Definition: regex:60
Definition: regex:64
Definition: regex:82
_Elem _Char
Definition: regex:2200
Definition: regex:2214
Definition: regex:65
Definition: regex:58
Definition: regex:55
Definition: regex:69
Definition: regex:144
Definition: regex:142
void _Next()
Definition: regex:4988
Definition: regex:81
Definition: regex:68
void _Quantifier()
Definition: regex:5497
Definition: regex:143
void _Expect(_Meta_type, regex_constants::error_type)
Definition: regex:5002
Definition: regex:56
Definition: regex:61
void _CharacterClass()
Definition: regex:5236
Definition: regex:62
bool _Wrapped_disjunction()
Definition: regex:5289
Definition: regex:57
Definition: regex:66
unsigned int _L_flags
Definition: regex:2202
Definition: regex:2235
Definition: regex:63
int _Disj_count
Definition: regex:2194
Definition: regex:59
void _Error(regex_constants::error_type)
Definition: regex:4883
template<class _FwdIt , class _Elem , class _RxTraits >
void _Parser< _FwdIt, _Elem, _RxTraits >::_AtomEscape ( )
inlineprivate
5470  { // check for valid atom escape
5471  if ((_L_flags & _L_bckr) && _DecimalDigits())
5472  { // check for valid back reference
5473  if (_Val == 0)
5474  { // handle \0
5475  if (!(_L_flags & _L_bzr_chr))
5477  else
5478  _Nfa._Add_char((_Elem)_Val);
5479  }
5480  else if (((_L_flags & _L_lim_bckr) && _BRE_MAX_GRP < _Val)
5481  || _Grp_idx < _Val
5482  || _Finished_grps.size() <= static_cast<size_t>(_Val)
5483  || !_Finished_grps[_Val])
5485  else
5486  _Nfa._Add_backreference(_Val);
5487  }
5488  else if (_CharacterEscape())
5489  _Nfa._Add_char((_Elem)_Val);
5490  else if (!(_L_flags & _L_esc_wsd) || !_CharacterClassEscape(true))
5492  }
bool _DecimalDigits()
Definition: regex:5031
_Builder< _FwdIt, _Elem, _RxTraits > _Nfa
Definition: regex:2196
Definition: regex:2227
Definition: regex:141
Definition: regex:140
int _Val
Definition: regex:2199
bool _CharacterClassEscape(bool)
Definition: regex:5104
Definition: regex:2215
size_type size() const _NOEXCEPT
Definition: vector:1178
const unsigned int _BRE_MAX_GRP
Definition: regex:1476
bool _CharacterEscape()
Definition: regex:5425
Definition: regex:2216
vector< bool > _Finished_grps
Definition: regex:2195
int _Grp_idx
Definition: regex:2193
Definition: regex:2224
unsigned int _L_flags
Definition: regex:2202
void _Error(regex_constants::error_type)
Definition: regex:4883
template<class _FwdIt , class _Elem , class _RxTraits >
void _Parser< _FwdIt, _Elem, _RxTraits >::_CharacterClass ( )
inlineprivate
5237  { // add bracket expression
5238  _Nfa._Add_class();
5239  if (_Mchar == _Meta_caret)
5240  { // negate bracket expression
5241  _Nfa._Negate();
5242  _Next();
5243  }
5244  if ((_L_flags & _L_brk_rstr) && _Mchar == _Meta_rsq)
5245  { // insert initial ] when not special
5246  _Nfa._Add_char_to_class(_Meta_rsq);
5247  _Next();
5248  }
5249  _ClassRanges();
5250  }
Definition: regex:2236
_Builder< _FwdIt, _Elem, _RxTraits > _Nfa
Definition: regex:2196
_Meta_type _Mchar
Definition: regex:2201
Definition: regex:64
Definition: regex:58
void _Next()
Definition: regex:4988
void _ClassRanges()
Definition: regex:5194
unsigned int _L_flags
Definition: regex:2202
template<class _FwdIt , class _Elem , class _RxTraits >
bool _Parser< _FwdIt, _Elem, _RxTraits >::_CharacterClassEscape ( bool  _Addit)
inlineprivate
5105  { // check for character class escape
5106  typename _RxTraits::char_class_type _Cls;
5107  _FwdIt _Ch0 = _Pat;
5108  if (_Ch0 == _End
5109  || (_Cls = _Traits.lookup_classname(_Pat, ++_Ch0,
5110  (_Flags & regex_constants::icase) != 0)) == 0)
5111  return (false);
5112 
5113  if (_Addit)
5114  _Nfa._Add_class();
5115  _Nfa._Add_named_class(_Cls,
5116  _Traits.isctype(_Char, _RxTraits::_Ch_upper));
5117  _Next();
5118  return (true);
5119  }
_Builder< _FwdIt, _Elem, _RxTraits > _Nfa
Definition: regex:2196
_Elem _Char
Definition: regex:2200
regex_constants::syntax_option_type _Flags
Definition: regex:2198
_FwdIt _End
Definition: regex:2192
const _RxTraits & _Traits
Definition: regex:2197
void _Next()
Definition: regex:4988
Definition: regex:108
_FwdIt _Pat
Definition: regex:2190
template<class _FwdIt , class _Elem , class _RxTraits >
bool _Parser< _FwdIt, _Elem, _RxTraits >::_CharacterEscape ( )
inlineprivate
5426  { // check for valid character escape
5427  if (_Mchar == _Meta_eos)
5429 
5430  if ((_L_flags & _L_esc_ffn && _Do_ffn(_Char))
5431  || (_L_flags & _L_esc_ffnx && _Do_ffnx(_Char)))
5432  _Next();
5433  else if (_Char == _Esc_ctrl && (_L_flags & _L_esc_ctrl))
5434  { // handle control escape sequence
5435  _Next();
5436  if (!_Traits.isctype(_Char, _RxTraits::_Ch_alpha))
5438  _Val = (char)(_Char % 32);
5439  _Next();
5440  }
5441  else if (_Char == _Esc_hex && (_L_flags & _L_esc_hex))
5442  { // handle hexadecimal escape sequence
5443  _Next();
5444  _HexDigits(2);
5445  }
5446  else if (_Char == _Esc_uni && (_L_flags & _L_esc_uni))
5447  { // handle unicode escape sequence
5448  _Next();
5449  _HexDigits(4);
5450  }
5451  else if ((_L_flags & _L_esc_oct) && _OctalDigits())
5452  { // handle octal escape sequence
5453  if (_Val == 0)
5455  }
5456  else
5457  return (_IdentityEscape());
5458 
5460  < (unsigned int)_Val)
5462  _Val = (_Elem)_Val;
5463  return (true);
5464  }
_Meta_type _Mchar
Definition: regex:2201
Definition: regex:74
Definition: regex:2218
Definition: regex:2220
_Elem _Char
Definition: regex:2200
Definition: regex:90
Definition: regex:140
Definition: regex:2225
Definition: regex:2223
int _Val
Definition: regex:2199
bool _Do_ffn(_Elem)
Definition: regex:5391
void _HexDigits(int)
Definition: regex:5039
const _RxTraits & _Traits
Definition: regex:2197
bool _OctalDigits()
Definition: regex:5048
Definition: regex:2222
Definition: regex:91
void _Next()
Definition: regex:4988
Definition: regex:2219
bool _Do_ffnx(_Elem)
Definition: regex:5411
Definition: regex:92
bool _IdentityEscape()
Definition: regex:5376
unsigned int _L_flags
Definition: regex:2202
Definition: limits:101
void _Error(regex_constants::error_type)
Definition: regex:4883
template<class _FwdIt , class _Elem , class _RxTraits >
_Prs_ret _Parser< _FwdIt, _Elem, _RxTraits >::_ClassAtom ( )
inlineprivate
5148  { // check for class atom
5149  if (_Mchar == _Meta_esc)
5150  { // check for valid escape sequence
5151  _Next();
5152  if (_L_flags & _L_grp_esc)
5153  return (_ClassEscape(false));
5154  else if ((_L_flags & _L_esc_ffn && _Do_ffn(_Char))
5155  || (_L_flags & _L_esc_ffnx && _Do_ffnx(_Char)))
5156  { // advance to next character
5157  _Next();
5158  return (_Prs_chr);
5159  }
5160  _Val = _Meta_esc;
5161  return (_Prs_chr);
5162  }
5163  else if (_Mchar == _Meta_lsq)
5164  { // check for valid delimited expression
5165  _Next();
5166  if (_Mchar == _Meta_colon
5167  || _Mchar == _Meta_equal
5168  || _Mchar == _Meta_dot)
5169  { // handle delimited expression
5170  _Meta_type _St = _Mchar;
5171  _Next();
5172  _Do_ex_class(_St);
5173  return (_Prs_set);
5174  }
5175  else
5176  { // handle ordinary [
5177  _Val = _Meta_lsq;
5178  return (_Prs_chr);
5179  }
5180  }
5181  else if (_Mchar == _Meta_rsq || _Mchar == _Meta_eos)
5182  return (_Prs_none);
5183  else
5184  { // handle ordinary character
5185  _Val = _Char;
5186  _Next();
5187  return (_Prs_chr);
5188  }
5189  }
_Meta_type _Mchar
Definition: regex:2201
Definition: regex:74
Definition: regex:64
Definition: regex:72
void _Do_ex_class(_Meta_type)
Definition: regex:5056
_Elem _Char
Definition: regex:2200
Definition: regex:2134
Definition: regex:2223
int _Val
Definition: regex:2199
Definition: regex:2228
bool _Do_ffn(_Elem)
Definition: regex:5391
_Prs_ret _ClassEscape(bool)
Definition: regex:5124
Definition: regex:2222
Definition: regex:2133
void _Next()
Definition: regex:4988
Definition: regex:71
bool _Do_ffnx(_Elem)
Definition: regex:5411
Definition: regex:2135
Definition: regex:66
unsigned int _L_flags
Definition: regex:2202
Definition: regex:63
Definition: regex:59
_Meta_type
Definition: regex:53
template<class _FwdIt , class _Elem , class _RxTraits >
_Prs_ret _Parser< _FwdIt, _Elem, _RxTraits >::_ClassEscape ( bool  _Addit)
inlineprivate
5125  { // check for class escape
5126  if ((_L_flags & _L_esc_bsl)
5127  && _Char == _Esc_bsl)
5128  { // handle escape backslash if allowed
5129  _Val = _Esc_bsl;
5130  _Next();
5131  return (_Prs_chr);
5132  }
5133  else if ((_L_flags & _L_esc_wsd) && _CharacterClassEscape(_Addit))
5134  return (_Prs_set);
5135  else if (_DecimalDigits())
5136  { // check for invalid value
5137  if (_Val != 0)
5139  return (_Prs_chr);
5140  }
5141  return (_CharacterEscape() ? _Prs_chr : _Prs_none);
5142  }
bool _DecimalDigits()
Definition: regex:5031
Definition: regex:2221
_Elem _Char
Definition: regex:2200
Definition: regex:140
Definition: regex:2134
int _Val
Definition: regex:2199
bool _CharacterClassEscape(bool)
Definition: regex:5104
Definition: regex:2133
bool _CharacterEscape()
Definition: regex:5425
void _Next()
Definition: regex:4988
Definition: regex:2135
Definition: regex:2224
Definition: regex:80
unsigned int _L_flags
Definition: regex:2202
void _Error(regex_constants::error_type)
Definition: regex:4883
template<class _FwdIt , class _Elem , class _RxTraits >
void _Parser< _FwdIt, _Elem, _RxTraits >::_ClassRanges ( )
inlineprivate
5195  { // check for valid class ranges
5196  _Prs_ret _Ret;
5197 
5198  for (; ; )
5199  { // process characters through end of bracket expression
5200  if ((_Ret = _ClassAtom()) == _Prs_none)
5201  return;
5202  else if (_Ret == _Prs_set)
5203  ;
5204  else if (_Val == 0 && !(_L_flags & _L_bzr_chr))
5206  else if (_Mchar == _Meta_dash)
5207  { // check for valid range
5208  _Next();
5209  _Elem _Chr1 = (_Elem)_Val;
5210  if ((_Ret = _ClassAtom()) == _Prs_none)
5211  { // treat - as ordinary character
5212  _Nfa._Add_char_to_class((_Elem)_Val);
5213  _Nfa._Add_char_to_class(_Meta_dash);
5214  return;
5215  }
5216  else if (_Ret == _Prs_set)
5217  _Error(regex_constants::error_range); // set follows dash
5218  else if (_Flags & regex_constants::collate)
5219  { // translate ends of range
5220  _Val = _Traits.translate((_Elem)_Val);
5221  _Chr1 = _Traits.translate(_Chr1);
5222  }
5223  if ((typename _RxTraits::_Uelem)_Val
5224  < (typename _RxTraits::_Uelem)_Chr1)
5226  _Nfa._Add_range(_Chr1, (_Elem)_Val);
5227  }
5228  else
5229  _Nfa._Add_char_to_class((_Elem)_Val);
5230  }
5231  }
_Builder< _FwdIt, _Elem, _RxTraits > _Nfa
Definition: regex:2196
_Meta_type _Mchar
Definition: regex:2201
Definition: regex:2227
Definition: regex:140
_Prs_ret
Definition: regex:2131
regex_constants::syntax_option_type _Flags
Definition: regex:2198
int _Val
Definition: regex:2199
const _RxTraits & _Traits
Definition: regex:2197
Definition: regex:146
Definition: regex:2133
Definition: regex:67
_Prs_ret _ClassAtom()
Definition: regex:5147
void _Next()
Definition: regex:4988
Definition: regex:111
Definition: regex:2135
unsigned int _L_flags
Definition: regex:2202
void _Error(regex_constants::error_type)
Definition: regex:4883
template<class _FwdIt , class _Elem , class _RxTraits >
_Root_node * _Parser< _FwdIt, _Elem, _RxTraits >::_Compile ( )
inline
5703  { // compile regular expression
5704  _Root_node *_Res = 0;
5705  _TRY_BEGIN
5706  _Node_base *_Pos1 = _Nfa._Begin_capture_group(0);
5707  _Disjunction();
5708  if (_Pat != _End)
5710  _Nfa._End_group(_Pos1);
5711  _Res = _Nfa._End_pattern();
5712  _Res->_Fl = _Flags;
5713  _Res->_Marks = _Mark_count();
5714  _Calculate_loop_simplicity(_Res, 0, 0);
5715  _CATCH_ALL
5716  _Nfa._Discard_pattern();
5717  _RERAISE;
5718  _CATCH_END
5719  return (_Res);
5720  }
unsigned int _Marks
Definition: regex:1696
_Builder< _FwdIt, _Elem, _RxTraits > _Nfa
Definition: regex:2196
#define _TRY_BEGIN
Definition: xstddef:60
#define _CATCH_END
Definition: xstddef:63
regex_constants::syntax_option_type _Flags
Definition: regex:2198
_FwdIt _End
Definition: regex:2192
regex_constants::syntax_option_type _Fl
Definition: regex:1694
#define _CATCH_ALL
Definition: xstddef:62
Definition: regex:152
void _Calculate_loop_simplicity(_Node_base *_Nx, _Node_base *_Ne, _Node_rep *_Outer_rep)
Definition: regex:5652
_FwdIt _Pat
Definition: regex:2190
void _Disjunction()
Definition: regex:5626
#define _RERAISE
Definition: xstddef:74
unsigned int _Mark_count() const
Definition: regex:2151
Definition: regex:1683
Definition: regex:1651
void _Error(regex_constants::error_type)
Definition: regex:4883
template<class _FwdIt , class _Elem , class _RxTraits >
bool _Parser< _FwdIt, _Elem, _RxTraits >::_DecimalDigits ( )
inlineprivate
5032  { // check for decimal value
5033  return (_Do_digits(10, INT_MAX) != INT_MAX);
5034  }
int _Do_digits(int _Base, int _Count)
Definition: regex:5013
#define INT_MAX
Definition: limits.h:35
template<class _FwdIt , class _Elem , class _RxTraits >
void _Parser< _FwdIt, _Elem, _RxTraits >::_Disjunction ( )
inlineprivate
5627  { // check for valid disjunction
5628  _Node_base *_Pos1 = _Nfa._Getmark();
5629  if (_Alternative())
5630  ;
5631  else if (_Mchar != _Meta_bar)
5632  return; // zero-length alternative not followed by '|'
5633  else
5634  { // zero-length leading alternative
5635  _Node_base *_Pos3 = _Nfa._Begin_group();
5636  _Nfa._End_group(_Pos3);
5637  }
5638 
5639  _Node_base *_Pos2 = _Nfa._Begin_if(_Pos1);
5640  while (_Mchar == _Meta_bar)
5641  { // append terms as long as we keep finding | characters
5642  _Next();
5643  if (!_Alternative())
5644  { // zero-length trailing alternative
5645  _Node_base *_Pos3 = _Nfa._Begin_group();
5646  _Nfa._End_group(_Pos3);
5647  }
5648  _Nfa._Else_if(_Pos1, _Pos2);
5649  }
5650  }
_Builder< _FwdIt, _Elem, _RxTraits > _Nfa
Definition: regex:2196
_Meta_type _Mchar
Definition: regex:2201
Definition: regex:65
void _Next()
Definition: regex:4988
bool _Alternative()
Definition: regex:5544
Definition: regex:1651
template<class _FwdIt , class _Elem , class _RxTraits >
void _Parser< _FwdIt, _Elem, _RxTraits >::_Do_assert_group ( bool  _Neg)
inlineprivate
5280  { // add assert group
5281  _Node_base *_Pos1 = _Nfa._Begin_assert_group(_Neg);
5282  _Disjunction();
5283  _Nfa._End_assert_group(_Pos1);
5284  }
_Builder< _FwdIt, _Elem, _RxTraits > _Nfa
Definition: regex:2196
void _Disjunction()
Definition: regex:5626
Definition: regex:1651
template<class _FwdIt , class _Elem , class _RxTraits >
void _Parser< _FwdIt, _Elem, _RxTraits >::_Do_capture_group ( )
inlineprivate
5256  { // add capture group
5257 // if (_MAX_GRP <= ++_Grp_idx)
5258 // _Error(regex_constants::error_complexity);
5259  _Node_base *_Pos1 = _Nfa._Begin_capture_group(++_Grp_idx);
5260  _Disjunction();
5261  _Nfa._End_group(_Pos1);
5263  _Finished_grps[((_Node_capture *)_Pos1)->_Idx] = true;
5264  }
_Builder< _FwdIt, _Elem, _RxTraits > _Nfa
Definition: regex:2196
void resize(size_type _Newsize)
Definition: vector:1132
Definition: regex:1732
vector< bool > _Finished_grps
Definition: regex:2195
void _Disjunction()
Definition: regex:5626
int _Grp_idx
Definition: regex:2193
Definition: regex:1651
template<class _FwdIt , class _Elem , class _RxTraits >
int _Parser< _FwdIt, _Elem, _RxTraits >::_Do_digits ( int  _Base,
int  _Count 
)
inlineprivate
5015  { // translate digits to numeric value
5016  int _Chv;
5017  _Val = 0;
5018  while (_Count != 0 && (_Chv = _Traits.value(_Char, _Base)) != -1)
5019  { // append next digit
5020  --_Count;
5021  _Val *= _Base;
5022  _Val += _Chv;
5023  _Next();
5024  }
5025  return (_Count);
5026  }
unsigned int _Count
Definition: xcomplex:668
_Elem _Char
Definition: regex:2200
int _Val
Definition: regex:2199
const _RxTraits & _Traits
Definition: regex:2197
void _Next()
Definition: regex:4988
template<class _FwdIt , class _Elem , class _RxTraits >
void _Parser< _FwdIt, _Elem, _RxTraits >::_Do_ex_class ( _Meta_type  _End_arg)
inlineprivate
5057  { // handle delimited expressions within bracket expression
5058  regex_constants::error_type _Errtype =
5063  _FwdIt _Beg = _Pat;
5064  _Iter_diff_t<_FwdIt> _Diff = 0;
5065 
5066  while (_Mchar != _Meta_colon && _Mchar != _Meta_equal
5067  && _Mchar != _Meta_dot && _Mchar != _Meta_eos)
5068  { // advance to end delimiter
5069  _Next();
5070  ++_Diff;
5071  }
5072  if (_Mchar != _End_arg)
5073  _Error(_Errtype);
5074  else if (_End_arg == _Meta_colon)
5075  { // handle named character class
5076  typename _RxTraits::char_class_type _Cls =
5077  _Traits.lookup_classname(_Beg, _Pat,
5078  (_Flags & regex_constants::icase) != 0);
5079  if (!_Cls)
5081  _Nfa._Add_named_class(_Cls);
5082  }
5083  else if (_End_arg == _Meta_equal)
5084  { // process =
5085  if (_Beg == _Pat)
5087  else
5088  _Nfa._Add_equiv(_Beg, _Pat, _Diff);
5089  }
5090  else if (_End_arg == _Meta_dot)
5091  { // process .
5092  if (_Beg == _Pat)
5094  else
5095  _Nfa._Add_coll(_Beg, _Pat, _Diff);
5096  }
5097  _Next();
5098  _Expect(_Meta_rsq, _Errtype);
5099  }
_Builder< _FwdIt, _Elem, _RxTraits > _Nfa
Definition: regex:2196
_Meta_type _Mchar
Definition: regex:2201
Definition: regex:74
Definition: regex:64
Definition: regex:72
typename iterator_traits< _Iter >::difference_type _Iter_diff_t
Definition: xutility:651
regex_constants::syntax_option_type _Flags
Definition: regex:2198
const _RxTraits & _Traits
Definition: regex:2197
Definition: regex:139
Definition: regex:138
void _Next()
Definition: regex:4988
Definition: regex:108
Definition: regex:71
void _Expect(_Meta_type, regex_constants::error_type)
Definition: regex:5002
Definition: regex:152
_FwdIt _Pat
Definition: regex:2190
Definition: regex:59
void _Error(regex_constants::error_type)
Definition: regex:4883
error_type
Definition: regex:136
template<class _FwdIt , class _Elem , class _RxTraits >
bool _Parser< _FwdIt, _Elem, _RxTraits >::_Do_ffn ( _Elem  _Ch)
inlineprivate
5392  { // check for limited file format escape characters
5393  if (_Ch == _Esc_ctrl_f)
5394  _Val = '\f';
5395  else if (_Ch == _Esc_ctrl_n)
5396  _Val = '\n';
5397  else if (_Ch == _Esc_ctrl_r)
5398  _Val = '\r';
5399  else if (_Ch == _Esc_ctrl_t)
5400  _Val = '\t';
5401  else if (_Ch == _Esc_ctrl_v)
5402  _Val = '\v';
5403  else
5404  return (false);
5405  return (true);
5406  }
Definition: regex:87
Definition: regex:86
int _Val
Definition: regex:2199
_Check_return_ _In_ wchar_t _Ch
Definition: vcruntime_string.h:89
Definition: regex:88
Definition: regex:89
Definition: regex:85
template<class _FwdIt , class _Elem , class _RxTraits >
bool _Parser< _FwdIt, _Elem, _RxTraits >::_Do_ffnx ( _Elem  _Ch)
inlineprivate
5412  { // check for the remaining file format escape characters
5413  if (_Ch == _Esc_ctrl_a)
5414  _Val = '\a';
5415  else if (_Ch == _Esc_ctrl_b)
5416  _Val = '\b';
5417  else
5418  return (false);
5419  return (true);
5420  }
int _Val
Definition: regex:2199
_Check_return_ _In_ wchar_t _Ch
Definition: vcruntime_string.h:89
Definition: regex:84
Definition: regex:83
template<class _FwdIt , class _Elem , class _RxTraits >
void _Parser< _FwdIt, _Elem, _RxTraits >::_Do_noncapture_group ( )
inlineprivate
5270  { // add non-capture group
5271  _Node_base *_Pos1 = _Nfa._Begin_group();
5272  _Disjunction();
5273  _Nfa._End_group(_Pos1);
5274  }
_Builder< _FwdIt, _Elem, _RxTraits > _Nfa
Definition: regex:2196
void _Disjunction()
Definition: regex:5626
Definition: regex:1651
template<class _FwdIt , class _Elem , class _RxTraits >
void _Parser< _FwdIt, _Elem, _RxTraits >::_Error ( regex_constants::error_type  _Code)
inlineprivate
4885  { // handle error
4886  _Xregex_error(_Code);
4887  }
_CRTIMP2_PURE void __CLRCALL_PURE_OR_CDECL _Xregex_error(regex_constants::error_type _Code)
template<class _FwdIt , class _Elem , class _RxTraits >
void _Parser< _FwdIt, _Elem, _RxTraits >::_Expect ( _Meta_type  _St,
regex_constants::error_type  _Code 
)
inlineprivate
5004  { // check whether current meta-character is _St
5005  if (_Mchar != _St)
5006  _Error(_Code);
5007  _Next();
5008  }
_Meta_type _Mchar
Definition: regex:2201
void _Next()
Definition: regex:4988
void _Error(regex_constants::error_type)
Definition: regex:4883
template<class _FwdIt , class _Elem , class _RxTraits >
void _Parser< _FwdIt, _Elem, _RxTraits >::_HexDigits ( int  _Count)
inlineprivate
5040  { // check for _Count hex digits
5041  if (_Do_digits(16, _Count) != 0)
5043  }
unsigned int _Count
Definition: xcomplex:668
int _Do_digits(int _Base, int _Count)
Definition: regex:5013
Definition: regex:140
void _Error(regex_constants::error_type)
Definition: regex:4883
template<class _FwdIt , class _Elem , class _RxTraits >
bool _Parser< _FwdIt, _Elem, _RxTraits >::_IdentityEscape ( )
inlineprivate
5377  { // check whether an escape is valid, and process it if so
5378  if (_IsIdentityEscape())
5379  {
5380  _Val = _Char;
5381  _Next();
5382  return (true);
5383  }
5384  else
5385  return (false);
5386  }
_Elem _Char
Definition: regex:2200
int _Val
Definition: regex:2199
bool _IsIdentityEscape() const
Definition: regex:5327
void _Next()
Definition: regex:4988
template<class _FwdIt , class _Elem , class _RxTraits >
bool _Parser< _FwdIt, _Elem, _RxTraits >::_Is_esc ( ) const
inlineprivate
4893  { // assumes _Pat != _End
4894  _FwdIt _Ch0 = _Pat;
4895  return (++_Ch0 != _End
4896  && ((!(_L_flags & _L_nex_grp)
4897  && (*_Ch0 == _Meta_lpar || *_Ch0 == _Meta_rpar))
4898  || (!(_L_flags & _L_nex_rep)
4899  && (*_Ch0 == _Meta_lbr || *_Ch0 == _Meta_rbr))));
4900  }
Definition: regex:2211
_FwdIt _End
Definition: regex:2192
Definition: regex:55
Definition: regex:69
Definition: regex:68
Definition: regex:56
_FwdIt _Pat
Definition: regex:2190
Definition: regex:2210
unsigned int _L_flags
Definition: regex:2202
template<class _FwdIt , class _Elem , class _RxTraits >
bool _Parser< _FwdIt, _Elem, _RxTraits >::_IsIdentityEscape ( ) const
inlineprivate
5328  { // check for valid identity escape
5329  if (_L_flags & _L_ident_ECMA)
5330  // ECMAScript identity escape characters
5331  switch (_Char)
5332  {
5333  case 'c': // ASCII control character
5334  case 'd': // digit
5335  case 'D':
5336  case 's': // whitespace
5337  case 'S':
5338  case 'w': // word character
5339  case 'W':
5340  return (false);
5341  default:
5342  return (true);
5343  }
5344 
5345  switch (_Char)
5346  {
5347  case _Meta_dot:
5348  case _Meta_lsq:
5349  case _Meta_esc:
5350  case _Meta_star:
5351  case _Meta_bar:
5352  case _Meta_caret:
5353  case _Meta_dlr:
5354  // BRE, ERE, awk identity escape characters
5355  return (true);
5356  case _Meta_lpar:
5357  case _Meta_rpar:
5358  case _Meta_plus:
5359  case _Meta_query:
5360  case _Meta_lbr:
5361  case _Meta_rbr:
5362  // additional ERE identity escape characters
5363  return ((_L_flags & _L_ident_ERE) != 0);
5364  case '"':
5365  case '/':
5366  // additional awk identity escape characters
5367  return ((_L_flags & _L_ident_awk) != 0);
5368  default:
5369  return (false);
5370  }
5371  }
Definition: regex:60
_Elem _Char
Definition: regex:2200
Definition: regex:2229
Definition: regex:65
Definition: regex:58
Definition: regex:2230
Definition: regex:55
Definition: regex:69
Definition: regex:68
Definition: regex:56
Definition: regex:2231
Definition: regex:61
Definition: regex:62
Definition: regex:57
Definition: regex:66
unsigned int _L_flags
Definition: regex:2202
Definition: regex:63
Definition: regex:59
template<class _FwdIt , class _Elem , class _RxTraits >
unsigned int _Parser< _FwdIt, _Elem, _RxTraits >::_Mark_count ( ) const
inline
2152  { // return number of capture groups
2153  return (_Grp_idx + 1);
2154  }
int _Grp_idx
Definition: regex:2193
template<class _FwdIt , class _Elem , class _RxTraits >
void _Parser< _FwdIt, _Elem, _RxTraits >::_Next ( )
inlineprivate
4989  { // advance to next input character
4990  if (_Pat != _End)
4991  { // advance
4992  if (*_Pat == _Meta_esc && _Is_esc())
4993  ++_Pat;
4994  ++_Pat;
4995  }
4996  _Trans();
4997  }
_FwdIt _End
Definition: regex:2192
bool _Is_esc() const
Definition: regex:4892
void _Trans()
Definition: regex:4905
_FwdIt _Pat
Definition: regex:2190
Definition: regex:66
template<class _FwdIt , class _Elem , class _RxTraits >
bool _Parser< _FwdIt, _Elem, _RxTraits >::_OctalDigits ( )
inlineprivate
5049  { // check for up to 3 octal digits
5050  return (_Do_digits(8, 3) != 3);
5051  }
int _Do_digits(int _Base, int _Count)
Definition: regex:5013
template<class _FwdIt , class _Elem , class _RxTraits >
void _Parser< _FwdIt, _Elem, _RxTraits >::_Quantifier ( )
inlineprivate
5498  { // check for quantifier following atom
5499  int _Min = 0;
5500  int _Max = -1;
5501  if (_Mchar == _Meta_star)
5502  ;
5503  else if (_Mchar == _Meta_plus)
5504  _Min = 1;
5505  else if (_Mchar == _Meta_query)
5506  _Max = 1;
5507  else if (_Mchar == _Meta_lbr)
5508  { // check for valid bracketed value
5509  _Next();
5510  if (!_DecimalDigits())
5512  _Min = _Val;
5513  if (_Mchar != _Meta_comma)
5514  _Max = _Min;
5515  else
5516  { // check for decimal constant following comma
5517  _Next();
5518  if (_Mchar == _Meta_rbr)
5519  ;
5520  else if (!_DecimalDigits())
5522  else
5523  _Max = _Val;
5524  }
5525  if (_Mchar != _Meta_rbr || (_Max != -1 && _Max < _Min))
5527  }
5528  else
5529  return;
5530  _Nfa._Mark_final();
5531  _Next();
5532  if ((_L_flags & _L_ngr_rep) && _Mchar == _Meta_query)
5533  { // add non-greedy repeat node
5534  _Next();
5535  _Nfa._Add_rep(_Min, _Max, false);
5536  }
5537  else
5538  _Nfa._Add_rep(_Min, _Max, true);
5539  }
bool _DecimalDigits()
Definition: regex:5031
_Builder< _FwdIt, _Elem, _RxTraits > _Nfa
Definition: regex:2196
_Meta_type _Mchar
Definition: regex:2201
Definition: regex:60
Definition: regex:70
Definition: regex:145
int _Val
Definition: regex:2199
Definition: regex:69
void _Next()
Definition: regex:4988
Definition: regex:68
Definition: regex:61
Definition: regex:62
Definition: regex:2217
unsigned int _L_flags
Definition: regex:2202
void _Error(regex_constants::error_type)
Definition: regex:4883
template<class _FwdIt , class _Elem , class _RxTraits >
void _Parser< _FwdIt, _Elem, _RxTraits >::_Trans ( )
inlineprivate
4906  { // map character to meta-character
4907  static const char _Meta_map[] = { // TRANSITION, VSO#202551
4914  0}; // array of meta chars
4915 
4916  if (_Pat == _End)
4917  _Mchar = _Meta_eos, _Char = (_Elem)_Meta_eos;
4918  else
4919  { // map current character
4920  _Char = *_Pat;
4921  _Mchar = _CSTD strchr(_Meta_map, _Char) != 0
4922  ? (_Meta_type)_Char : _Meta_chr;
4923  }
4924  switch (_Char)
4925  { // handle special cases
4926  case _Meta_esc:
4927  if (_Is_esc())
4928  { // replace escape sequence
4929  _FwdIt _Ch0 = _Pat;
4930  _Mchar = _Meta_type(_Char = *++_Ch0);
4931  }
4932  break;
4933 
4934  case _Meta_nl:
4935  if ((_L_flags & _L_alt_nl) && _Disj_count == 0)
4936  _Mchar = _Meta_bar;
4937  break;
4938 
4939  case _Meta_lpar:
4940  case _Meta_rpar:
4941  if (!(_L_flags & _L_nex_grp))
4942  _Mchar = _Meta_chr;
4943  break;
4944 
4945  case _Meta_lbr:
4946  case _Meta_rbr:
4947  if (!(_L_flags & _L_nex_rep))
4948  _Mchar = _Meta_chr;
4949  break;
4950 
4951  case _Meta_star:
4952  if ((_L_flags & _L_star_beg)
4953  && _Nfa._Beg_expr())
4954  _Mchar = _Meta_chr;
4955  break;
4956 
4957  case _Meta_caret:
4958  if ((_L_flags & _L_anch_rstr)
4959  && !_Nfa._Beg_expr())
4960  _Mchar = _Meta_chr;
4961  break;
4962 
4963  case _Meta_dlr:
4964  { // check if $ is special
4965  _FwdIt _Ch0 = _Pat;
4966  if ((_L_flags & _L_anch_rstr)
4967  && ++_Ch0 != _End && *_Ch0 != _Meta_nl)
4968  _Mchar = _Meta_chr;
4969  break;
4970  }
4971 
4972  case _Meta_plus:
4973  case _Meta_query:
4974  if (!(_L_flags & _L_ext_rep))
4975  _Mchar = _Meta_chr;
4976  break;
4977 
4978  case _Meta_bar:
4979  if (!(_L_flags & _L_alt_pipe))
4980  _Mchar = _Meta_chr;
4981  break;
4982  }
4983  }
Definition: regex:2211
_Builder< _FwdIt, _Elem, _RxTraits > _Nfa
Definition: regex:2196
_Meta_type _Mchar
Definition: regex:2201
Definition: regex:74
Definition: regex:2232
Definition: regex:60
Definition: regex:2233
Definition: regex:70
Definition: regex:64
Definition: regex:73
Definition: regex:72
_Elem _Char
Definition: regex:2200
_FwdIt _End
Definition: regex:2192
Definition: regex:77
Definition: regex:65
Definition: regex:58
Definition: regex:55
Definition: regex:69
bool _Is_esc() const
Definition: regex:4892
Definition: regex:67
Definition: regex:78
Definition: regex:71
Definition: regex:2207
Definition: regex:68
Definition: regex:75
Definition: regex:56
_Check_return_ _VCRTIMP char _CONST_RETURN *__cdecl strchr(_In_z_ char const *_Str, _In_ int _Val)
Definition: regex:61
Definition: regex:62
_FwdIt _Pat
Definition: regex:2190
#define _CSTD
Definition: yvals.h:570
Definition: regex:76
Definition: regex:57
Definition: regex:2210
Definition: regex:66
unsigned int _L_flags
Definition: regex:2202
Definition: regex:63
int _Disj_count
Definition: regex:2194
Definition: regex:59
Definition: regex:2209
Definition: regex:2208
_Meta_type
Definition: regex:53
template<class _FwdIt , class _Elem , class _RxTraits >
bool _Parser< _FwdIt, _Elem, _RxTraits >::_Wrapped_disjunction ( )
inlineprivate
5290  { // add disjunction inside group
5291  ++_Disj_count;
5292  if (!(_L_flags & _L_empty_grp) && _Mchar == _Meta_rpar)
5294  else if ((_L_flags & _L_nc_grp) && _Mchar == _Meta_query)
5295  { // check for valid ECMAScript (?x ... ) group
5296  _Next();
5298  _Next();
5299  if (_Ch == _Meta_colon)
5301  else if (_Ch == _Meta_exc)
5302  { // process assert group, negating
5303  _Do_assert_group(true);
5304  --_Disj_count;
5305  return (false);
5306  }
5307  else if (_Ch == _Meta_equal)
5308  { // process assert group
5309  _Do_assert_group(false);
5310  --_Disj_count;
5311  return (false);
5312  }
5313  else
5315  }
5316  else if (_Flags & regex_constants::nosubs)
5318  else
5320  --_Disj_count;
5321  return (true);
5322  }
Definition: regex:109
_Meta_type _Mchar
Definition: regex:2201
void _Do_noncapture_group()
Definition: regex:5269
void _Do_assert_group(bool)
Definition: regex:5279
Definition: regex:73
Definition: regex:72
regex_constants::syntax_option_type _Flags
Definition: regex:2198
void _Do_capture_group()
Definition: regex:5255
_Check_return_ _In_ wchar_t _Ch
Definition: vcruntime_string.h:89
Definition: regex:2234
void _Next()
Definition: regex:4988
Definition: regex:71
Definition: regex:143
Definition: regex:56
Definition: regex:152
Definition: regex:2212
Definition: regex:62
unsigned int _L_flags
Definition: regex:2202
int _Disj_count
Definition: regex:2194
_Meta_type
Definition: regex:53
void _Error(regex_constants::error_type)
Definition: regex:4883

Member Data Documentation

template<class _FwdIt , class _Elem , class _RxTraits >
_FwdIt _Parser< _FwdIt, _Elem, _RxTraits >::_Begin
private
template<class _FwdIt , class _Elem , class _RxTraits >
_Elem _Parser< _FwdIt, _Elem, _RxTraits >::_Char
private
template<class _FwdIt , class _Elem , class _RxTraits >
int _Parser< _FwdIt, _Elem, _RxTraits >::_Disj_count
private
template<class _FwdIt , class _Elem , class _RxTraits >
_FwdIt _Parser< _FwdIt, _Elem, _RxTraits >::_End
private
template<class _FwdIt , class _Elem , class _RxTraits >
vector<bool> _Parser< _FwdIt, _Elem, _RxTraits >::_Finished_grps
private
template<class _FwdIt , class _Elem , class _RxTraits >
regex_constants::syntax_option_type _Parser< _FwdIt, _Elem, _RxTraits >::_Flags
private
template<class _FwdIt , class _Elem , class _RxTraits >
int _Parser< _FwdIt, _Elem, _RxTraits >::_Grp_idx
private
template<class _FwdIt , class _Elem , class _RxTraits >
unsigned int _Parser< _FwdIt, _Elem, _RxTraits >::_L_flags
private
template<class _FwdIt , class _Elem , class _RxTraits >
_Meta_type _Parser< _FwdIt, _Elem, _RxTraits >::_Mchar
private
template<class _FwdIt , class _Elem , class _RxTraits >
_Builder<_FwdIt, _Elem, _RxTraits> _Parser< _FwdIt, _Elem, _RxTraits >::_Nfa
private
template<class _FwdIt , class _Elem , class _RxTraits >
_FwdIt _Parser< _FwdIt, _Elem, _RxTraits >::_Pat
private
template<class _FwdIt , class _Elem , class _RxTraits >
const _RxTraits& _Parser< _FwdIt, _Elem, _RxTraits >::_Traits
private
template<class _FwdIt , class _Elem , class _RxTraits >
int _Parser< _FwdIt, _Elem, _RxTraits >::_Val
private

The documentation for this class was generated from the following file: