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
5731  _Grp_idx(0), _Disj_count(0), _Finished_grps(0),
5732  _Nfa(_Tr, _Fx), _Traits(_Tr), _Flags(_Fx)
5733  { // construct
5734 
5735  // PARSER LANGUAGE FLAGS
5736  constexpr unsigned int _ECMA_flags =
5741  | _L_empty_grp;
5742 
5743  constexpr unsigned int _Basic_flags =
5746 
5747  constexpr unsigned int _Grep_flags =
5748  _Basic_flags | _L_alt_nl | _L_no_nl;
5749 
5750  constexpr unsigned int _Extended_flags =
5753 
5754  constexpr unsigned int _Awk_flags =
5755  _Extended_flags | _L_esc_oct | _L_esc_ffn | _L_esc_ffnx | _L_ident_awk;
5756 
5757  constexpr unsigned int _Egrep_flags =
5758  _Extended_flags | _L_alt_nl | _L_no_nl;
5759 
5760  using namespace regex_constants;
5761  _L_flags = (_Flags & _Gmask) == ECMAScript
5762  || (_Flags & _Gmask) == 0 ? _ECMA_flags
5763  : (_Flags & _Gmask) == basic ? _Basic_flags
5764  : (_Flags & _Gmask) == extended ? _Extended_flags
5765  : (_Flags & _Gmask) == awk ? _Awk_flags
5766  : (_Flags & _Gmask) == grep ? _Grep_flags
5767  : (_Flags & _Gmask) == egrep ? _Egrep_flags
5768  : 0;
5769  if (_L_flags & _L_mtch_long)
5770  _Nfa._Setlong();
5771  _Trans();
5772  }
Definition: regex:2232
Definition: regex:2257
_Builder< _FwdIt, _Elem, _RxTraits > _Nfa
Definition: regex:2217
Definition: regex:2253
Definition: regex:95
Definition: regex:2248
Definition: regex:2242
Definition: regex:2254
Definition: regex:2239
_FwdIt _Begin
Definition: regex:2212
_RanIt _Plast
Definition: algorithm:2577
Definition: regex:2241
Definition: regex:103
Definition: regex:100
regex_constants::syntax_option_type _Flags
Definition: regex:2219
_FwdIt _End
Definition: regex:2213
Definition: regex:2246
Definition: regex:2235
_RanIt _Pfirst
Definition: algorithm:2576
Definition: regex:2244
Definition: regex:2250
Definition: regex:105
Definition: regex:2249
Definition: regex:2236
const _RxTraits & _Traits
Definition: regex:2218
Definition: regex:2251
Definition: regex:99
Definition: regex:102
Definition: regex:2255
Definition: regex:2258
Definition: regex:2243
Definition: regex:2237
void _Trans()
Definition: regex:4903
Definition: regex:101
Definition: regex:2240
Definition: regex:2228
vector< bool > _Finished_grps
Definition: regex:2216
Definition: regex:2234
Definition: regex:2252
Definition: regex:2233
_FwdIt _Pat
Definition: regex:2211
Definition: regex:104
int _Grp_idx
Definition: regex:2214
Definition: regex:2247
Definition: regex:2231
Definition: regex:2245
Definition: regex:2238
unsigned int _L_flags
Definition: regex:2223
Definition: regex:2256
int _Disj_count
Definition: regex:2215
Definition: regex:2230
Definition: regex:2229

Member Function Documentation

template<class _FwdIt , class _Elem , class _RxTraits >
bool _Parser< _FwdIt, _Elem, _RxTraits >::_Alternative ( )
inlineprivate
5543  { // check for valid alternative
5544  bool _Found = false;
5545  for (; ; )
5546  { // concatenate valid elements
5547  bool _Quant = true;
5548  if (_Mchar == _Meta_eos || _Mchar == _Meta_bar
5549  || (_Mchar == _Meta_rpar && _Disj_count != 0))
5550  return (_Found);
5551  else if (_Mchar == _Meta_rpar && !(_L_flags & _L_paren_bal))
5553  else if (_Mchar == _Meta_dot)
5554  { // add dot node
5555  _Nfa._Add_dot();
5556  _Next();
5557  }
5558  else if (_Mchar == _Meta_esc)
5559  { // check for valid escape sequence
5560  _Next();
5561  if ((_L_flags & _L_asrt_wrd) && _Char == _Esc_word)
5562  { // add word assert
5563  _Nfa._Add_wbound();
5564  _Next();
5565  _Quant = false;
5566  }
5567  else if ((_L_flags & _L_asrt_wrd) && _Char == _Esc_not_word)
5568  { // add not-word assert
5569  _Nfa._Add_wbound();
5570  _Nfa._Negate();
5571  _Next();
5572  _Quant = false;
5573  }
5574  else
5575  _AtomEscape();
5576  }
5577  else if (_Mchar == _Meta_lsq)
5578  { // add bracket expression
5579  _Next();
5580  _CharacterClass();
5582  }
5583  else if (_Mchar == _Meta_lpar)
5584  { // check for valid group
5585  _Next();
5586  _Quant = _Wrapped_disjunction();
5588  }
5589  else if (_Mchar == _Meta_caret)
5590  { // add bol node
5591  _Nfa._Add_bol();
5592  _Next();
5593  _Quant = false;
5594  }
5595  else if (_Mchar == _Meta_dlr)
5596  { // add eol node
5597  _Nfa._Add_eol();
5598  _Next();
5599  _Quant = false;
5600  }
5601  else if (_Mchar == _Meta_star
5602  || _Mchar == _Meta_plus
5603  || _Mchar == _Meta_query
5604  || _Mchar == _Meta_lbr)
5606  else if (_Mchar == _Meta_rbr && !(_L_flags & _L_paren_bal))
5608  else if (_Mchar == _Meta_rsq && !(_L_flags & _L_paren_bal))
5610  else
5611  { // add character
5612  _Nfa._Add_char(_Char);
5613  _Next();
5614  }
5615  if (_Quant)
5616  _Quantifier();
5617  _Found = true;
5618  }
5619  }
_Builder< _FwdIt, _Elem, _RxTraits > _Nfa
Definition: regex:2217
_Meta_type _Mchar
Definition: regex:2222
Definition: regex:73
void _AtomEscape()
Definition: regex:5467
Definition: regex:59
Definition: regex:63
Definition: regex:81
_Elem _Char
Definition: regex:2221
Definition: regex:2235
Definition: regex:64
Definition: regex:57
Definition: regex:54
Definition: regex:68
Definition: regex:143
Definition: regex:141
void _Next()
Definition: regex:4986
Definition: regex:80
Definition: regex:67
void _Quantifier()
Definition: regex:5495
Definition: regex:142
void _Expect(_Meta_type, regex_constants::error_type)
Definition: regex:5000
Definition: regex:55
Definition: regex:60
void _CharacterClass()
Definition: regex:5234
Definition: regex:61
bool _Wrapped_disjunction()
Definition: regex:5287
Definition: regex:56
Definition: regex:65
unsigned int _L_flags
Definition: regex:2223
Definition: regex:2256
Definition: regex:62
int _Disj_count
Definition: regex:2215
Definition: regex:58
void _Error(regex_constants::error_type)
Definition: regex:4881
template<class _FwdIt , class _Elem , class _RxTraits >
void _Parser< _FwdIt, _Elem, _RxTraits >::_AtomEscape ( )
inlineprivate
5468  { // check for valid atom escape
5469  if ((_L_flags & _L_bckr) && _DecimalDigits())
5470  { // check for valid back reference
5471  if (_Val == 0)
5472  { // handle \0
5473  if (!(_L_flags & _L_bzr_chr))
5475  else
5476  _Nfa._Add_char((_Elem)_Val);
5477  }
5478  else if (((_L_flags & _L_lim_bckr) && _BRE_MAX_GRP < _Val)
5479  || _Grp_idx < _Val
5480  || _Finished_grps.size() <= static_cast<size_t>(_Val)
5481  || !_Finished_grps[_Val])
5483  else
5484  _Nfa._Add_backreference(_Val);
5485  }
5486  else if (_CharacterEscape())
5487  _Nfa._Add_char((_Elem)_Val);
5488  else if (!(_L_flags & _L_esc_wsd) || !_CharacterClassEscape(true))
5490  }
bool _DecimalDigits()
Definition: regex:5029
_Builder< _FwdIt, _Elem, _RxTraits > _Nfa
Definition: regex:2217
Definition: regex:2248
Definition: regex:140
Definition: regex:139
int _Val
Definition: regex:2220
bool _CharacterClassEscape(bool)
Definition: regex:5102
Definition: regex:2236
size_type size() const _NOEXCEPT
Definition: vector:1708
const unsigned int _BRE_MAX_GRP
Definition: regex:1496
bool _CharacterEscape()
Definition: regex:5423
Definition: regex:2237
vector< bool > _Finished_grps
Definition: regex:2216
int _Grp_idx
Definition: regex:2214
Definition: regex:2245
unsigned int _L_flags
Definition: regex:2223
void _Error(regex_constants::error_type)
Definition: regex:4881
template<class _FwdIt , class _Elem , class _RxTraits >
void _Parser< _FwdIt, _Elem, _RxTraits >::_CharacterClass ( )
inlineprivate
5235  { // add bracket expression
5236  _Nfa._Add_class();
5237  if (_Mchar == _Meta_caret)
5238  { // negate bracket expression
5239  _Nfa._Negate();
5240  _Next();
5241  }
5242  if ((_L_flags & _L_brk_rstr) && _Mchar == _Meta_rsq)
5243  { // insert initial ] when not special
5244  _Nfa._Add_char_to_class(_Meta_rsq);
5245  _Next();
5246  }
5247  _ClassRanges();
5248  }
Definition: regex:2257
_Builder< _FwdIt, _Elem, _RxTraits > _Nfa
Definition: regex:2217
_Meta_type _Mchar
Definition: regex:2222
Definition: regex:63
Definition: regex:57
void _Next()
Definition: regex:4986
void _ClassRanges()
Definition: regex:5192
unsigned int _L_flags
Definition: regex:2223
template<class _FwdIt , class _Elem , class _RxTraits >
bool _Parser< _FwdIt, _Elem, _RxTraits >::_CharacterClassEscape ( bool  _Addit)
inlineprivate
5103  { // check for character class escape
5104  typename _RxTraits::char_class_type _Cls;
5105  _FwdIt _Ch0 = _Pat;
5106  if (_Ch0 == _End
5107  || (_Cls = _Traits.lookup_classname(_Pat, ++_Ch0,
5108  (_Flags & regex_constants::icase) != 0)) == 0)
5109  return (false);
5110 
5111  if (_Addit)
5112  _Nfa._Add_class();
5113  _Nfa._Add_named_class(_Cls,
5114  _Traits.isctype(_Char, _RxTraits::_Ch_upper));
5115  _Next();
5116  return (true);
5117  }
_Builder< _FwdIt, _Elem, _RxTraits > _Nfa
Definition: regex:2217
_Elem _Char
Definition: regex:2221
regex_constants::syntax_option_type _Flags
Definition: regex:2219
_FwdIt _End
Definition: regex:2213
const _RxTraits & _Traits
Definition: regex:2218
void _Next()
Definition: regex:4986
Definition: regex:107
_FwdIt _Pat
Definition: regex:2211
template<class _FwdIt , class _Elem , class _RxTraits >
bool _Parser< _FwdIt, _Elem, _RxTraits >::_CharacterEscape ( )
inlineprivate
5424  { // check for valid character escape
5425  if (_Mchar == _Meta_eos)
5427 
5428  if ((_L_flags & _L_esc_ffn && _Do_ffn(_Char))
5429  || (_L_flags & _L_esc_ffnx && _Do_ffnx(_Char)))
5430  _Next();
5431  else if (_Char == _Esc_ctrl && (_L_flags & _L_esc_ctrl))
5432  { // handle control escape sequence
5433  _Next();
5434  if (!_Traits.isctype(_Char, _RxTraits::_Ch_alpha))
5436  _Val = (char)(_Char % 32);
5437  _Next();
5438  }
5439  else if (_Char == _Esc_hex && (_L_flags & _L_esc_hex))
5440  { // handle hexadecimal escape sequence
5441  _Next();
5442  _HexDigits(2);
5443  }
5444  else if (_Char == _Esc_uni && (_L_flags & _L_esc_uni))
5445  { // handle unicode escape sequence
5446  _Next();
5447  _HexDigits(4);
5448  }
5449  else if ((_L_flags & _L_esc_oct) && _OctalDigits())
5450  { // handle octal escape sequence
5451  if (_Val == 0)
5453  }
5454  else
5455  return (_IdentityEscape());
5456 
5458  < (unsigned int)_Val)
5460  _Val = (_Elem)_Val;
5461  return (true);
5462  }
_Meta_type _Mchar
Definition: regex:2222
Definition: regex:73
Definition: regex:2239
Definition: regex:2241
_Elem _Char
Definition: regex:2221
Definition: regex:89
Definition: regex:139
Definition: regex:2246
Definition: regex:2244
int _Val
Definition: regex:2220
bool _Do_ffn(_Elem)
Definition: regex:5389
void _HexDigits(int)
Definition: regex:5037
const _RxTraits & _Traits
Definition: regex:2218
bool _OctalDigits()
Definition: regex:5046
Definition: regex:2243
Definition: regex:90
unsigned char
Definition: mbstring.h:107
void _Next()
Definition: regex:4986
Definition: regex:2240
bool _Do_ffnx(_Elem)
Definition: regex:5409
Definition: regex:91
bool _IdentityEscape()
Definition: regex:5374
unsigned int _L_flags
Definition: regex:2223
Definition: limits:102
void _Error(regex_constants::error_type)
Definition: regex:4881
template<class _FwdIt , class _Elem , class _RxTraits >
_Prs_ret _Parser< _FwdIt, _Elem, _RxTraits >::_ClassAtom ( )
inlineprivate
5146  { // check for class atom
5147  if (_Mchar == _Meta_esc)
5148  { // check for valid escape sequence
5149  _Next();
5150  if (_L_flags & _L_grp_esc)
5151  return (_ClassEscape(false));
5152  else if ((_L_flags & _L_esc_ffn && _Do_ffn(_Char))
5153  || (_L_flags & _L_esc_ffnx && _Do_ffnx(_Char)))
5154  { // advance to next character
5155  _Next();
5156  return (_Prs_chr);
5157  }
5158  _Val = _Meta_esc;
5159  return (_Prs_chr);
5160  }
5161  else if (_Mchar == _Meta_lsq)
5162  { // check for valid delimited expression
5163  _Next();
5164  if (_Mchar == _Meta_colon
5165  || _Mchar == _Meta_equal
5166  || _Mchar == _Meta_dot)
5167  { // handle delimited expression
5168  _Meta_type _St = _Mchar;
5169  _Next();
5170  _Do_ex_class(_St);
5171  return (_Prs_set);
5172  }
5173  else
5174  { // handle ordinary [
5175  _Val = _Meta_lsq;
5176  return (_Prs_chr);
5177  }
5178  }
5179  else if (_Mchar == _Meta_rsq || _Mchar == _Meta_eos)
5180  return (_Prs_none);
5181  else
5182  { // handle ordinary character
5183  _Val = _Char;
5184  _Next();
5185  return (_Prs_chr);
5186  }
5187  }
_Meta_type _Mchar
Definition: regex:2222
Definition: regex:73
Definition: regex:63
Definition: regex:71
void _Do_ex_class(_Meta_type)
Definition: regex:5054
_Elem _Char
Definition: regex:2221
Definition: regex:2155
Definition: regex:2244
int _Val
Definition: regex:2220
Definition: regex:2249
bool _Do_ffn(_Elem)
Definition: regex:5389
_Prs_ret _ClassEscape(bool)
Definition: regex:5122
Definition: regex:2243
Definition: regex:2154
void _Next()
Definition: regex:4986
Definition: regex:70
bool _Do_ffnx(_Elem)
Definition: regex:5409
Definition: regex:2156
Definition: regex:65
unsigned int _L_flags
Definition: regex:2223
Definition: regex:62
Definition: regex:58
_Meta_type
Definition: regex:52
template<class _FwdIt , class _Elem , class _RxTraits >
_Prs_ret _Parser< _FwdIt, _Elem, _RxTraits >::_ClassEscape ( bool  _Addit)
inlineprivate
5123  { // check for class escape
5124  if ((_L_flags & _L_esc_bsl)
5125  && _Char == _Esc_bsl)
5126  { // handle escape backslash if allowed
5127  _Val = _Esc_bsl;
5128  _Next();
5129  return (_Prs_chr);
5130  }
5131  else if ((_L_flags & _L_esc_wsd) && _CharacterClassEscape(_Addit))
5132  return (_Prs_set);
5133  else if (_DecimalDigits())
5134  { // check for invalid value
5135  if (_Val != 0)
5137  return (_Prs_chr);
5138  }
5139  return (_CharacterEscape() ? _Prs_chr : _Prs_none);
5140  }
bool _DecimalDigits()
Definition: regex:5029
Definition: regex:2242
_Elem _Char
Definition: regex:2221
Definition: regex:139
Definition: regex:2155
int _Val
Definition: regex:2220
bool _CharacterClassEscape(bool)
Definition: regex:5102
Definition: regex:2154
bool _CharacterEscape()
Definition: regex:5423
void _Next()
Definition: regex:4986
Definition: regex:2156
Definition: regex:2245
Definition: regex:79
unsigned int _L_flags
Definition: regex:2223
void _Error(regex_constants::error_type)
Definition: regex:4881
template<class _FwdIt , class _Elem , class _RxTraits >
void _Parser< _FwdIt, _Elem, _RxTraits >::_ClassRanges ( )
inlineprivate
5193  { // check for valid class ranges
5194  _Prs_ret _Ret;
5195 
5196  for (; ; )
5197  { // process characters through end of bracket expression
5198  if ((_Ret = _ClassAtom()) == _Prs_none)
5199  return;
5200  else if (_Ret == _Prs_set)
5201  ;
5202  else if (_Val == 0 && !(_L_flags & _L_bzr_chr))
5204  else if (_Mchar == _Meta_dash)
5205  { // check for valid range
5206  _Next();
5207  _Elem _Chr1 = (_Elem)_Val;
5208  if ((_Ret = _ClassAtom()) == _Prs_none)
5209  { // treat - as ordinary character
5210  _Nfa._Add_char_to_class((_Elem)_Val);
5211  _Nfa._Add_char_to_class(_Meta_dash);
5212  return;
5213  }
5214  else if (_Ret == _Prs_set)
5215  _Error(regex_constants::error_range); // set follows dash
5216  else if (_Flags & regex_constants::collate)
5217  { // translate ends of range
5218  _Val = _Traits.translate((_Elem)_Val);
5219  _Chr1 = _Traits.translate(_Chr1);
5220  }
5221  if ((typename _RxTraits::_Uelem)_Val
5222  < (typename _RxTraits::_Uelem)_Chr1)
5224  _Nfa._Add_range(_Chr1, (_Elem)_Val);
5225  }
5226  else
5227  _Nfa._Add_char_to_class((_Elem)_Val);
5228  }
5229  }
_Builder< _FwdIt, _Elem, _RxTraits > _Nfa
Definition: regex:2217
_Meta_type _Mchar
Definition: regex:2222
Definition: regex:2248
Definition: regex:139
_Prs_ret
Definition: regex:2152
regex_constants::syntax_option_type _Flags
Definition: regex:2219
int _Val
Definition: regex:2220
const _RxTraits & _Traits
Definition: regex:2218
Definition: regex:145
Definition: regex:2154
Definition: regex:66
_Prs_ret _ClassAtom()
Definition: regex:5145
void _Next()
Definition: regex:4986
Definition: regex:110
Definition: regex:2156
unsigned int _L_flags
Definition: regex:2223
void _Error(regex_constants::error_type)
Definition: regex:4881
template<class _FwdIt , class _Elem , class _RxTraits >
_Root_node * _Parser< _FwdIt, _Elem, _RxTraits >::_Compile ( )
inline
5704  { // compile regular expression
5705  _Root_node *_Res = 0;
5706  _TRY_BEGIN
5707  _Node_base *_Pos1 = _Nfa._Begin_capture_group(0);
5708  _Disjunction();
5709  if (_Pat != _End)
5711  _Nfa._End_group(_Pos1);
5712  _Res = _Nfa._End_pattern();
5713  _Res->_Fl = _Flags;
5714  _Res->_Marks = _Mark_count();
5715  _Calculate_loop_simplicity(_Res, 0, 0);
5716  _CATCH_ALL
5717  _Nfa._Discard_pattern();
5718  _RERAISE;
5719  _CATCH_END
5720  return (_Res);
5721  }
unsigned int _Marks
Definition: regex:1717
_Builder< _FwdIt, _Elem, _RxTraits > _Nfa
Definition: regex:2217
#define _TRY_BEGIN
Definition: xstddef:26
#define _CATCH_END
Definition: xstddef:29
regex_constants::syntax_option_type _Flags
Definition: regex:2219
_FwdIt _End
Definition: regex:2213
regex_constants::syntax_option_type _Fl
Definition: regex:1715
#define _CATCH_ALL
Definition: xstddef:28
Definition: regex:151
void _Calculate_loop_simplicity(_Node_base *_Nx, _Node_base *_Ne, _Node_rep *_Outer_rep)
Definition: regex:5650
_FwdIt _Pat
Definition: regex:2211
void _Disjunction()
Definition: regex:5624
#define _RERAISE
Definition: xstddef:32
unsigned int _Mark_count() const
Definition: regex:2172
Definition: regex:1704
Definition: regex:1672
void _Error(regex_constants::error_type)
Definition: regex:4881
template<class _FwdIt , class _Elem , class _RxTraits >
bool _Parser< _FwdIt, _Elem, _RxTraits >::_DecimalDigits ( )
inlineprivate
5030  { // check for decimal value
5031  return (_Do_digits(10, INT_MAX) != INT_MAX);
5032  }
int _Do_digits(int _Base, int _Count)
Definition: regex:5011
#define INT_MAX
Definition: limits.h:35
template<class _FwdIt , class _Elem , class _RxTraits >
void _Parser< _FwdIt, _Elem, _RxTraits >::_Disjunction ( )
inlineprivate
5625  { // check for valid disjunction
5626  _Node_base *_Pos1 = _Nfa._Getmark();
5627  if (_Alternative())
5628  ;
5629  else if (_Mchar != _Meta_bar)
5630  return; // zero-length alternative not followed by '|'
5631  else
5632  { // zero-length leading alternative
5633  _Node_base *_Pos3 = _Nfa._Begin_group();
5634  _Nfa._End_group(_Pos3);
5635  }
5636 
5637  _Node_base *_Pos2 = _Nfa._Begin_if(_Pos1);
5638  while (_Mchar == _Meta_bar)
5639  { // append terms as long as we keep finding | characters
5640  _Next();
5641  if (!_Alternative())
5642  { // zero-length trailing alternative
5643  _Node_base *_Pos3 = _Nfa._Begin_group();
5644  _Nfa._End_group(_Pos3);
5645  }
5646  _Nfa._Else_if(_Pos1, _Pos2);
5647  }
5648  }
_Builder< _FwdIt, _Elem, _RxTraits > _Nfa
Definition: regex:2217
_Meta_type _Mchar
Definition: regex:2222
Definition: regex:64
void _Next()
Definition: regex:4986
bool _Alternative()
Definition: regex:5542
Definition: regex:1672
template<class _FwdIt , class _Elem , class _RxTraits >
void _Parser< _FwdIt, _Elem, _RxTraits >::_Do_assert_group ( bool  _Neg)
inlineprivate
5278  { // add assert group
5279  _Node_base *_Pos1 = _Nfa._Begin_assert_group(_Neg);
5280  _Disjunction();
5281  _Nfa._End_assert_group(_Pos1);
5282  }
_Builder< _FwdIt, _Elem, _RxTraits > _Nfa
Definition: regex:2217
void _Disjunction()
Definition: regex:5624
Definition: regex:1672
template<class _FwdIt , class _Elem , class _RxTraits >
void _Parser< _FwdIt, _Elem, _RxTraits >::_Do_capture_group ( )
inlineprivate
5254  { // add capture group
5255 // if (_MAX_GRP <= ++_Grp_idx)
5256 // _Error(regex_constants::error_complexity);
5257  _Node_base *_Pos1 = _Nfa._Begin_capture_group(++_Grp_idx);
5258  _Disjunction();
5259  _Nfa._End_group(_Pos1);
5261  _Finished_grps[((_Node_capture *)_Pos1)->_Idx] = true;
5262  }
_Builder< _FwdIt, _Elem, _RxTraits > _Nfa
Definition: regex:2217
Definition: regex:1753
void resize(_CRT_GUARDOVERFLOW const size_type _Newsize)
Definition: vector:1489
vector< bool > _Finished_grps
Definition: regex:2216
void _Disjunction()
Definition: regex:5624
int _Grp_idx
Definition: regex:2214
Definition: regex:1672
template<class _FwdIt , class _Elem , class _RxTraits >
int _Parser< _FwdIt, _Elem, _RxTraits >::_Do_digits ( int  _Base,
int  _Count 
)
inlineprivate
5013  { // translate digits to numeric value
5014  int _Chv;
5015  _Val = 0;
5016  while (_Count != 0 && (_Chv = _Traits.value(_Char, _Base)) != -1)
5017  { // append next digit
5018  --_Count;
5019  _Val *= _Base;
5020  _Val += _Chv;
5021  _Next();
5022  }
5023  return (_Count);
5024  }
_Elem _Char
Definition: regex:2221
int _Val
Definition: regex:2220
const _RxTraits & _Traits
Definition: regex:2218
_In_ int _Base
Definition: time.h:323
void _Next()
Definition: regex:4986
_Diff _Count
Definition: algorithm:1941
template<class _FwdIt , class _Elem , class _RxTraits >
void _Parser< _FwdIt, _Elem, _RxTraits >::_Do_ex_class ( _Meta_type  _End_arg)
inlineprivate
5055  { // handle delimited expressions within bracket expression
5056  regex_constants::error_type _Errtype =
5061  _FwdIt _Beg = _Pat;
5062  _Iter_diff_t<_FwdIt> _Diff = 0;
5063 
5064  while (_Mchar != _Meta_colon && _Mchar != _Meta_equal
5065  && _Mchar != _Meta_dot && _Mchar != _Meta_eos)
5066  { // advance to end delimiter
5067  _Next();
5068  ++_Diff;
5069  }
5070  if (_Mchar != _End_arg)
5071  _Error(_Errtype);
5072  else if (_End_arg == _Meta_colon)
5073  { // handle named character class
5074  typename _RxTraits::char_class_type _Cls =
5075  _Traits.lookup_classname(_Beg, _Pat,
5076  (_Flags & regex_constants::icase) != 0);
5077  if (!_Cls)
5079  _Nfa._Add_named_class(_Cls);
5080  }
5081  else if (_End_arg == _Meta_equal)
5082  { // process =
5083  if (_Beg == _Pat)
5085  else
5086  _Nfa._Add_equiv(_Beg, _Pat, _Diff);
5087  }
5088  else if (_End_arg == _Meta_dot)
5089  { // process .
5090  if (_Beg == _Pat)
5092  else
5093  _Nfa._Add_coll(_Beg, _Pat, _Diff);
5094  }
5095  _Next();
5096  _Expect(_Meta_rsq, _Errtype);
5097  }
_Builder< _FwdIt, _Elem, _RxTraits > _Nfa
Definition: regex:2217
_Meta_type _Mchar
Definition: regex:2222
Definition: regex:73
Definition: regex:63
Definition: regex:71
typename iterator_traits< _Iter >::difference_type _Iter_diff_t
Definition: xutility:653
regex_constants::syntax_option_type _Flags
Definition: regex:2219
const _RxTraits & _Traits
Definition: regex:2218
Definition: regex:138
Definition: regex:137
void _Next()
Definition: regex:4986
Definition: regex:107
Definition: regex:70
void _Expect(_Meta_type, regex_constants::error_type)
Definition: regex:5000
Definition: regex:151
_FwdIt _Pat
Definition: regex:2211
Definition: regex:58
void _Error(regex_constants::error_type)
Definition: regex:4881
error_type
Definition: regex:135
template<class _FwdIt , class _Elem , class _RxTraits >
bool _Parser< _FwdIt, _Elem, _RxTraits >::_Do_ffn ( _Elem  _Ch)
inlineprivate
5390  { // check for limited file format escape characters
5391  if (_Ch == _Esc_ctrl_f)
5392  _Val = '\f';
5393  else if (_Ch == _Esc_ctrl_n)
5394  _Val = '\n';
5395  else if (_Ch == _Esc_ctrl_r)
5396  _Val = '\r';
5397  else if (_Ch == _Esc_ctrl_t)
5398  _Val = '\t';
5399  else if (_Ch == _Esc_ctrl_v)
5400  _Val = '\v';
5401  else
5402  return (false);
5403  return (true);
5404  }
Definition: regex:86
Definition: regex:85
int _Val
Definition: regex:2220
_Check_return_ _In_ wchar_t _Ch
Definition: vcruntime_string.h:89
Definition: regex:87
Definition: regex:88
Definition: regex:84
template<class _FwdIt , class _Elem , class _RxTraits >
bool _Parser< _FwdIt, _Elem, _RxTraits >::_Do_ffnx ( _Elem  _Ch)
inlineprivate
5410  { // check for the remaining file format escape characters
5411  if (_Ch == _Esc_ctrl_a)
5412  _Val = '\a';
5413  else if (_Ch == _Esc_ctrl_b)
5414  _Val = '\b';
5415  else
5416  return (false);
5417  return (true);
5418  }
int _Val
Definition: regex:2220
_Check_return_ _In_ wchar_t _Ch
Definition: vcruntime_string.h:89
Definition: regex:83
Definition: regex:82
template<class _FwdIt , class _Elem , class _RxTraits >
void _Parser< _FwdIt, _Elem, _RxTraits >::_Do_noncapture_group ( )
inlineprivate
5268  { // add non-capture group
5269  _Node_base *_Pos1 = _Nfa._Begin_group();
5270  _Disjunction();
5271  _Nfa._End_group(_Pos1);
5272  }
_Builder< _FwdIt, _Elem, _RxTraits > _Nfa
Definition: regex:2217
void _Disjunction()
Definition: regex:5624
Definition: regex:1672
template<class _FwdIt , class _Elem , class _RxTraits >
void _Parser< _FwdIt, _Elem, _RxTraits >::_Error ( regex_constants::error_type  _Code)
inlineprivate
4883  { // handle error
4884  _Xregex_error(_Code);
4885  }
_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
5002  { // check whether current meta-character is _St
5003  if (_Mchar != _St)
5004  _Error(_Code);
5005  _Next();
5006  }
_Meta_type _Mchar
Definition: regex:2222
void _Next()
Definition: regex:4986
void _Error(regex_constants::error_type)
Definition: regex:4881
template<class _FwdIt , class _Elem , class _RxTraits >
void _Parser< _FwdIt, _Elem, _RxTraits >::_HexDigits ( int  _Count)
inlineprivate
5038  { // check for _Count hex digits
5039  if (_Do_digits(16, _Count) != 0)
5041  }
int _Do_digits(int _Base, int _Count)
Definition: regex:5011
Definition: regex:139
_Diff _Count
Definition: algorithm:1941
void _Error(regex_constants::error_type)
Definition: regex:4881
template<class _FwdIt , class _Elem , class _RxTraits >
bool _Parser< _FwdIt, _Elem, _RxTraits >::_IdentityEscape ( )
inlineprivate
5375  { // check whether an escape is valid, and process it if so
5376  if (_IsIdentityEscape())
5377  {
5378  _Val = _Char;
5379  _Next();
5380  return (true);
5381  }
5382  else
5383  return (false);
5384  }
_Elem _Char
Definition: regex:2221
int _Val
Definition: regex:2220
bool _IsIdentityEscape() const
Definition: regex:5325
void _Next()
Definition: regex:4986
template<class _FwdIt , class _Elem , class _RxTraits >
bool _Parser< _FwdIt, _Elem, _RxTraits >::_Is_esc ( ) const
inlineprivate
4891  { // assumes _Pat != _End
4892  _FwdIt _Ch0 = _Pat;
4893  return (++_Ch0 != _End
4894  && ((!(_L_flags & _L_nex_grp)
4895  && (*_Ch0 == _Meta_lpar || *_Ch0 == _Meta_rpar))
4896  || (!(_L_flags & _L_nex_rep)
4897  && (*_Ch0 == _Meta_lbr || *_Ch0 == _Meta_rbr))));
4898  }
Definition: regex:2232
_FwdIt _End
Definition: regex:2213
Definition: regex:54
Definition: regex:68
Definition: regex:67
Definition: regex:55
_FwdIt _Pat
Definition: regex:2211
Definition: regex:2231
unsigned int _L_flags
Definition: regex:2223
template<class _FwdIt , class _Elem , class _RxTraits >
bool _Parser< _FwdIt, _Elem, _RxTraits >::_IsIdentityEscape ( ) const
inlineprivate
5326  { // check for valid identity escape
5327  if (_L_flags & _L_ident_ECMA)
5328  // ECMAScript identity escape characters
5329  switch (_Char)
5330  {
5331  case 'c': // ASCII control character
5332  case 'd': // digit
5333  case 'D':
5334  case 's': // whitespace
5335  case 'S':
5336  case 'w': // word character
5337  case 'W':
5338  return (false);
5339  default:
5340  return (true);
5341  }
5342 
5343  switch (_Char)
5344  {
5345  case _Meta_dot:
5346  case _Meta_lsq:
5347  case _Meta_esc:
5348  case _Meta_star:
5349  case _Meta_bar:
5350  case _Meta_caret:
5351  case _Meta_dlr:
5352  // BRE, ERE, awk identity escape characters
5353  return (true);
5354  case _Meta_lpar:
5355  case _Meta_rpar:
5356  case _Meta_plus:
5357  case _Meta_query:
5358  case _Meta_lbr:
5359  case _Meta_rbr:
5360  // additional ERE identity escape characters
5361  return ((_L_flags & _L_ident_ERE) != 0);
5362  case '"':
5363  case '/':
5364  // additional awk identity escape characters
5365  return ((_L_flags & _L_ident_awk) != 0);
5366  default:
5367  return (false);
5368  }
5369  }
Definition: regex:59
_Elem _Char
Definition: regex:2221
Definition: regex:2250
Definition: regex:64
Definition: regex:57
Definition: regex:2251
Definition: regex:54
Definition: regex:68
Definition: regex:67
Definition: regex:55
Definition: regex:2252
Definition: regex:60
Definition: regex:61
Definition: regex:56
Definition: regex:65
unsigned int _L_flags
Definition: regex:2223
Definition: regex:62
Definition: regex:58
template<class _FwdIt , class _Elem , class _RxTraits >
unsigned int _Parser< _FwdIt, _Elem, _RxTraits >::_Mark_count ( ) const
inline
2173  { // return number of capture groups
2174  return (_Grp_idx + 1);
2175  }
int _Grp_idx
Definition: regex:2214
template<class _FwdIt , class _Elem , class _RxTraits >
void _Parser< _FwdIt, _Elem, _RxTraits >::_Next ( )
inlineprivate
4987  { // advance to next input character
4988  if (_Pat != _End)
4989  { // advance
4990  if (*_Pat == _Meta_esc && _Is_esc())
4991  ++_Pat;
4992  ++_Pat;
4993  }
4994  _Trans();
4995  }
_FwdIt _End
Definition: regex:2213
bool _Is_esc() const
Definition: regex:4890
void _Trans()
Definition: regex:4903
_FwdIt _Pat
Definition: regex:2211
Definition: regex:65
template<class _FwdIt , class _Elem , class _RxTraits >
bool _Parser< _FwdIt, _Elem, _RxTraits >::_OctalDigits ( )
inlineprivate
5047  { // check for up to 3 octal digits
5048  return (_Do_digits(8, 3) != 3);
5049  }
int _Do_digits(int _Base, int _Count)
Definition: regex:5011
template<class _FwdIt , class _Elem , class _RxTraits >
void _Parser< _FwdIt, _Elem, _RxTraits >::_Quantifier ( )
inlineprivate
5496  { // check for quantifier following atom
5497  int _Min = 0;
5498  int _Max = -1;
5499  if (_Mchar == _Meta_star)
5500  ;
5501  else if (_Mchar == _Meta_plus)
5502  _Min = 1;
5503  else if (_Mchar == _Meta_query)
5504  _Max = 1;
5505  else if (_Mchar == _Meta_lbr)
5506  { // check for valid bracketed value
5507  _Next();
5508  if (!_DecimalDigits())
5510  _Min = _Val;
5511  if (_Mchar != _Meta_comma)
5512  _Max = _Min;
5513  else
5514  { // check for decimal constant following comma
5515  _Next();
5516  if (_Mchar == _Meta_rbr)
5517  ;
5518  else if (!_DecimalDigits())
5520  else
5521  _Max = _Val;
5522  }
5523  if (_Mchar != _Meta_rbr || (_Max != -1 && _Max < _Min))
5525  }
5526  else
5527  return;
5528  _Nfa._Mark_final();
5529  _Next();
5530  if ((_L_flags & _L_ngr_rep) && _Mchar == _Meta_query)
5531  { // add non-greedy repeat node
5532  _Next();
5533  _Nfa._Add_rep(_Min, _Max, false);
5534  }
5535  else
5536  _Nfa._Add_rep(_Min, _Max, true);
5537  }
bool _DecimalDigits()
Definition: regex:5029
_Builder< _FwdIt, _Elem, _RxTraits > _Nfa
Definition: regex:2217
_Meta_type _Mchar
Definition: regex:2222
Definition: regex:59
Definition: regex:69
Definition: regex:144
int _Val
Definition: regex:2220
Definition: regex:68
void _Next()
Definition: regex:4986
Definition: regex:67
Definition: regex:60
Definition: regex:61
Definition: regex:2238
unsigned int _L_flags
Definition: regex:2223
void _Error(regex_constants::error_type)
Definition: regex:4881
template<class _FwdIt , class _Elem , class _RxTraits >
void _Parser< _FwdIt, _Elem, _RxTraits >::_Trans ( )
inlineprivate
4904  { // map character to meta-character
4905  static constexpr char _Meta_map[] = {
4912  0}; // array of meta chars
4913 
4914  if (_Pat == _End)
4915  _Mchar = _Meta_eos, _Char = (_Elem)_Meta_eos;
4916  else
4917  { // map current character
4918  _Char = *_Pat;
4919  _Mchar = _CSTD strchr(_Meta_map, _Char) != 0
4920  ? (_Meta_type)_Char : _Meta_chr;
4921  }
4922  switch (_Char)
4923  { // handle special cases
4924  case _Meta_esc:
4925  if (_Is_esc())
4926  { // replace escape sequence
4927  _FwdIt _Ch0 = _Pat;
4928  _Mchar = _Meta_type(_Char = *++_Ch0);
4929  }
4930  break;
4931 
4932  case _Meta_nl:
4933  if ((_L_flags & _L_alt_nl) && _Disj_count == 0)
4934  _Mchar = _Meta_bar;
4935  break;
4936 
4937  case _Meta_lpar:
4938  case _Meta_rpar:
4939  if (!(_L_flags & _L_nex_grp))
4940  _Mchar = _Meta_chr;
4941  break;
4942 
4943  case _Meta_lbr:
4944  case _Meta_rbr:
4945  if (!(_L_flags & _L_nex_rep))
4946  _Mchar = _Meta_chr;
4947  break;
4948 
4949  case _Meta_star:
4950  if ((_L_flags & _L_star_beg)
4951  && _Nfa._Beg_expr())
4952  _Mchar = _Meta_chr;
4953  break;
4954 
4955  case _Meta_caret:
4956  if ((_L_flags & _L_anch_rstr)
4957  && !_Nfa._Beg_expr())
4958  _Mchar = _Meta_chr;
4959  break;
4960 
4961  case _Meta_dlr:
4962  { // check if $ is special
4963  _FwdIt _Ch0 = _Pat;
4964  if ((_L_flags & _L_anch_rstr)
4965  && ++_Ch0 != _End && *_Ch0 != _Meta_nl)
4966  _Mchar = _Meta_chr;
4967  break;
4968  }
4969 
4970  case _Meta_plus:
4971  case _Meta_query:
4972  if (!(_L_flags & _L_ext_rep))
4973  _Mchar = _Meta_chr;
4974  break;
4975 
4976  case _Meta_bar:
4977  if (!(_L_flags & _L_alt_pipe))
4978  _Mchar = _Meta_chr;
4979  break;
4980  }
4981  }
Definition: regex:2232
_Builder< _FwdIt, _Elem, _RxTraits > _Nfa
Definition: regex:2217
_Meta_type _Mchar
Definition: regex:2222
Definition: regex:73
Definition: regex:2253
Definition: regex:59
Definition: regex:2254
Definition: regex:69
Definition: regex:63
Definition: regex:72
Definition: regex:71
_Elem _Char
Definition: regex:2221
_FwdIt _End
Definition: regex:2213
Definition: regex:76
Definition: regex:64
Definition: regex:57
Definition: regex:54
Definition: regex:68
bool _Is_esc() const
Definition: regex:4890
Definition: regex:66
Definition: regex:77
Definition: regex:70
Definition: regex:2228
Definition: regex:67
Definition: regex:74
Definition: regex:55
_Check_return_ _VCRTIMP char _CONST_RETURN *__cdecl strchr(_In_z_ char const *_Str, _In_ int _Val)
Definition: regex:60
Definition: regex:61
_FwdIt _Pat
Definition: regex:2211
#define _CSTD
Definition: yvals.h:570
Definition: regex:75
Definition: regex:56
Definition: regex:2231
Definition: regex:65
unsigned int _L_flags
Definition: regex:2223
Definition: regex:62
int _Disj_count
Definition: regex:2215
Definition: regex:58
Definition: regex:2230
Definition: regex:2229
_Meta_type
Definition: regex:52
template<class _FwdIt , class _Elem , class _RxTraits >
bool _Parser< _FwdIt, _Elem, _RxTraits >::_Wrapped_disjunction ( )
inlineprivate
5288  { // add disjunction inside group
5289  ++_Disj_count;
5290  if (!(_L_flags & _L_empty_grp) && _Mchar == _Meta_rpar)
5292  else if ((_L_flags & _L_nc_grp) && _Mchar == _Meta_query)
5293  { // check for valid ECMAScript (?x ... ) group
5294  _Next();
5296  _Next();
5297  if (_Ch == _Meta_colon)
5299  else if (_Ch == _Meta_exc)
5300  { // process assert group, negating
5301  _Do_assert_group(true);
5302  --_Disj_count;
5303  return (false);
5304  }
5305  else if (_Ch == _Meta_equal)
5306  { // process assert group
5307  _Do_assert_group(false);
5308  --_Disj_count;
5309  return (false);
5310  }
5311  else
5313  }
5314  else if (_Flags & regex_constants::nosubs)
5316  else
5318  --_Disj_count;
5319  return (true);
5320  }
Definition: regex:108
_Meta_type _Mchar
Definition: regex:2222
void _Do_noncapture_group()
Definition: regex:5267
void _Do_assert_group(bool)
Definition: regex:5277
Definition: regex:72
Definition: regex:71
regex_constants::syntax_option_type _Flags
Definition: regex:2219
void _Do_capture_group()
Definition: regex:5253
_Check_return_ _In_ wchar_t _Ch
Definition: vcruntime_string.h:89
Definition: regex:2255
void _Next()
Definition: regex:4986
Definition: regex:70
Definition: regex:142
Definition: regex:55
Definition: regex:151
Definition: regex:2233
Definition: regex:61
unsigned int _L_flags
Definition: regex:2223
int _Disj_count
Definition: regex:2215
_Meta_type
Definition: regex:52
void _Error(regex_constants::error_type)
Definition: regex:4881

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: