111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// class template regex -*- C++ -*- 211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Copyright (C) 2010-2014 Free Software Foundation, Inc. 411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// This file is part of the GNU ISO C++ Library. This library is free 611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// software; you can redistribute it and/or modify it under the 711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// terms of the GNU General Public License as published by the 811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Free Software Foundation; either version 3, or (at your option) 911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// any later version. 1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// This library is distributed in the hope that it will be useful, 1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// but WITHOUT ANY WARRANTY; without even the implied warranty of 1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// GNU General Public License for more details. 1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Under Section 7 of GPL version 3, you are granted additional 1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// permissions described in the GCC Runtime Library Exception, version 1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 3.1, as published by the Free Software Foundation. 1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// You should have received a copy of the GNU General Public License and 2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// a copy of the GCC Runtime Library Exception along with this program; 2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// <http://www.gnu.org/licenses/>. 2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/** 2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @file bits/regex_compiler.h 2711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This is an internal header file, included by other library headers. 2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Do not attempt to use it directly. @headername{regex} 2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertnamespace std _GLIBCXX_VISIBILITY(default) 3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ 3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertnamespace __detail 3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ 3511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_GLIBCXX_BEGIN_NAMESPACE_VERSION 3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @addtogroup regex-detail 3911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @{ 4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename, bool, bool> 4311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct _BracketMatcher; 4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 4511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Builds an NFA from an input iterator interval. 4711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * The %_TraitsT type should fulfill requirements [28.3]. 4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 5011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _TraitsT> 5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert class _Compiler 5211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 5311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert public: 5411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename _TraitsT::char_type _CharT; 5511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef const _CharT* _IterT; 5611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef _NFA<_TraitsT> _RegexT; 5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef regex_constants::syntax_option_type _FlagT; 5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 5911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _Compiler(_IterT __b, _IterT __e, 6011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _TraitsT& __traits, _FlagT __flags); 6111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::shared_ptr<_RegexT> 6311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_get_nfa() 6411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return make_shared<_RegexT>(std::move(_M_nfa)); } 6511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 6611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert private: 6711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef _Scanner<_CharT> _ScannerT; 6811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename _TraitsT::string_type _StringT; 6911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename _ScannerT::_TokenT _TokenT; 7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef _StateSeq<_TraitsT> _StateSeqT; 7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef std::stack<_StateSeqT> _StackT; 7211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef std::ctype<_CharT> _CtypeT; 7311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 7411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // accepts a specific token or returns false. 7511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert bool 7611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_match_token(_TokenT __token); 7711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 7811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void 7911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_disjunction(); 8011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 8111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void 8211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_alternative(); 8311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 8411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert bool 8511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_term(); 8611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 8711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert bool 8811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_assertion(); 8911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 9011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert bool 9111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_quantifier(); 9211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 9311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert bool 9411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_atom(); 9511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 9611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert bool 9711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_bracket_expression(); 9811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 9911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<bool __icase, bool __collate> 10011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void 10111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_insert_any_matcher_ecma(); 10211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 10311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<bool __icase, bool __collate> 10411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void 10511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_insert_any_matcher_posix(); 10611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 10711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<bool __icase, bool __collate> 10811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void 10911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_insert_char_matcher(); 11011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 11111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<bool __icase, bool __collate> 11211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void 11311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_insert_character_class_matcher(); 11411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 11511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<bool __icase, bool __collate> 11611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void 11711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_insert_bracket_matcher(bool __neg); 11811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 11911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<bool __icase, bool __collate> 12011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void 12111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_expression_term(_BracketMatcher<_TraitsT, __icase, __collate>& 12211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __matcher); 12311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 12411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int 12511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_cur_int_value(int __radix); 12611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 12711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert bool 12811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_try_char(); 12911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 13011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _StateSeqT 13111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_pop() 13211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 13311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto ret = _M_stack.top(); 13411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_stack.pop(); 13511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return ret; 13611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 13711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 13811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _FlagT _M_flags; 13911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _TraitsT& _M_traits; 14011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _CtypeT& _M_ctype; 14111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _ScannerT _M_scanner; 14211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _RegexT _M_nfa; 14311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _StringT _M_value; 14411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _StackT _M_stack; 14511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert }; 14611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 14711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _TraitsT> 14811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert inline std::shared_ptr<_NFA<_TraitsT>> 14911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __compile_nfa(const typename _TraitsT::char_type* __first, 15011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const typename _TraitsT::char_type* __last, 15111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _TraitsT& __traits, 15211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert regex_constants::syntax_option_type __flags) 15311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 15411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert using _Cmplr = _Compiler<_TraitsT>; 15511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return _Cmplr(__first, __last, __traits, __flags)._M_get_nfa(); 15611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 15711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 15811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // [28.13.14] 15911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _TraitsT, bool __icase, bool __collate> 16011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert class _RegexTranslator 16111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 16211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert public: 16311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename _TraitsT::char_type _CharT; 16411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename _TraitsT::string_type _StringT; 16511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename std::conditional<__collate, 16611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _StringT, 16711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _CharT>::type _StrTransT; 16811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 16911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert explicit 17011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _RegexTranslator(const _TraitsT& __traits) 17111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert : _M_traits(__traits) 17211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { } 17311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 17411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _CharT 17511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_translate(_CharT __ch) const 17611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 17711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (__icase) 17811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return _M_traits.translate_nocase(__ch); 17911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert else if (__collate) 18011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return _M_traits.translate(__ch); 18111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert else 18211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return __ch; 18311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 18411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 18511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _StrTransT 18611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_transform(_CharT __ch) const 18711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 18811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return _M_transform_impl(__ch, typename integral_constant<bool, 18911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __collate>::type()); 19011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 19111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 19211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert private: 19311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _StrTransT 19411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_transform_impl(_CharT __ch, false_type) const 19511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return __ch; } 19611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 19711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _StrTransT 19811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_transform_impl(_CharT __ch, true_type) const 19911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 20011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _StrTransT __str = _StrTransT(1, _M_translate(__ch)); 20111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return _M_traits.transform(__str.begin(), __str.end()); 20211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 20311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 20411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _TraitsT& _M_traits; 20511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert }; 20611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 20711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _TraitsT> 20811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert class _RegexTranslator<_TraitsT, false, false> 20911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 21011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert public: 21111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename _TraitsT::char_type _CharT; 21211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef _CharT _StrTransT; 21311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 21411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert explicit 21511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _RegexTranslator(const _TraitsT& __traits) 21611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { } 21711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 21811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _CharT 21911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_translate(_CharT __ch) const 22011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return __ch; } 22111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 22211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _StrTransT 22311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_transform(_CharT __ch) const 22411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return __ch; } 22511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert }; 22611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 22711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _TraitsT, bool __is_ecma, bool __icase, bool __collate> 22811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct _AnyMatcher; 22911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 23011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _TraitsT, bool __icase, bool __collate> 23111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct _AnyMatcher<_TraitsT, false, __icase, __collate> 23211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 23311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef _RegexTranslator<_TraitsT, __icase, __collate> _TransT; 23411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename _TransT::_CharT _CharT; 23511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 23611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert explicit 23711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _AnyMatcher(const _TraitsT& __traits) 23811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert : _M_translator(__traits) 23911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { } 24011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 24111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert bool 24211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert operator()(_CharT __ch) const 24311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 24411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert static auto __nul = _M_translator._M_translate('\0'); 24511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return _M_translator._M_translate(__ch) != __nul; 24611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 24711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 24811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _TransT _M_translator; 24911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert }; 25011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 25111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _TraitsT, bool __icase, bool __collate> 25211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct _AnyMatcher<_TraitsT, true, __icase, __collate> 25311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 25411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef _RegexTranslator<_TraitsT, __icase, __collate> _TransT; 25511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename _TransT::_CharT _CharT; 25611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 25711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert explicit 25811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _AnyMatcher(const _TraitsT& __traits) 25911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert : _M_translator(__traits) 26011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { } 26111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 26211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert bool 26311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert operator()(_CharT __ch) const 26411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return _M_apply(__ch, typename is_same<_CharT, char>::type()); } 26511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 26611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert bool 26711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_apply(_CharT __ch, true_type) const 26811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 26911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto __c = _M_translator._M_translate(__ch); 27011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto __n = _M_translator._M_translate('\n'); 27111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto __r = _M_translator._M_translate('\r'); 27211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return __c != __n && __c != __r; 27311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 27411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 27511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert bool 27611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_apply(_CharT __ch, false_type) const 27711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 27811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto __c = _M_translator._M_translate(__ch); 27911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto __n = _M_translator._M_translate('\n'); 28011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto __r = _M_translator._M_translate('\r'); 28111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto __u2028 = _M_translator._M_translate(u'\u2028'); 28211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto __u2029 = _M_translator._M_translate(u'\u2029'); 28311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return __c != __n && __c != __r && __c != __u2028 && __c != __u2029; 28411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 28511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 28611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _TransT _M_translator; 28711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert }; 28811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 28911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _TraitsT, bool __icase, bool __collate> 29011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct _CharMatcher 29111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 29211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef _RegexTranslator<_TraitsT, __icase, __collate> _TransT; 29311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename _TransT::_CharT _CharT; 29411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 29511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _CharMatcher(_CharT __ch, const _TraitsT& __traits) 29611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert : _M_translator(__traits), _M_ch(_M_translator._M_translate(__ch)) 29711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { } 29811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 29911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert bool 30011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert operator()(_CharT __ch) const 30111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return _M_ch == _M_translator._M_translate(__ch); } 30211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 30311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _TransT _M_translator; 30411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _CharT _M_ch; 30511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert }; 30611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 30711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /// Matches a character range (bracket expression) 30811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _TraitsT, bool __icase, bool __collate> 30911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct _BracketMatcher 31011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 31111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert public: 31211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef _RegexTranslator<_TraitsT, __icase, __collate> _TransT; 31311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename _TransT::_CharT _CharT; 31411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename _TransT::_StrTransT _StrTransT; 31511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename _TraitsT::string_type _StringT; 31611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename _TraitsT::char_class_type _CharClassT; 31711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 31811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert public: 31911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _BracketMatcher(bool __is_non_matching, 32011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _TraitsT& __traits) 32111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert : _M_class_set(0), _M_translator(__traits), _M_traits(__traits), 32211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_is_non_matching(__is_non_matching) 32311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifdef _GLIBCXX_DEBUG 32411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert , _M_is_ready(false) 32511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 32611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { } 32711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 32811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert bool 32911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert operator()(_CharT __ch) const 33011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 33111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _GLIBCXX_DEBUG_ASSERT(_M_is_ready); 33211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return _M_apply(__ch, _IsChar()); 33311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 33411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 33511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void 33611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_add_char(_CharT __c) 33711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 33811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_char_set.push_back(_M_translator._M_translate(__c)); 33911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifdef _GLIBCXX_DEBUG 34011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_is_ready = false; 34111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 34211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 34311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 34411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void 34511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_add_collating_element(const _StringT& __s) 34611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 34711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto __st = _M_traits.lookup_collatename(__s.data(), 34811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __s.data() + __s.size()); 34911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (__st.empty()) 35011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __throw_regex_error(regex_constants::error_collate); 35111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_char_set.push_back(_M_translator._M_translate(__st[0])); 35211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifdef _GLIBCXX_DEBUG 35311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_is_ready = false; 35411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 35511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 35611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 35711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void 35811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_add_equivalence_class(const _StringT& __s) 35911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 36011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto __st = _M_traits.lookup_collatename(__s.data(), 36111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __s.data() + __s.size()); 36211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (__st.empty()) 36311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __throw_regex_error(regex_constants::error_collate); 36411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __st = _M_traits.transform_primary(__st.data(), 36511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __st.data() + __st.size()); 36611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_equiv_set.push_back(__st); 36711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifdef _GLIBCXX_DEBUG 36811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_is_ready = false; 36911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 37011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 37111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 37211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // __neg should be true for \D, \S and \W only. 37311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void 37411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_add_character_class(const _StringT& __s, bool __neg) 37511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 37611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto __mask = _M_traits.lookup_classname(__s.data(), 37711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __s.data() + __s.size(), 37811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __icase); 37911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (__mask == 0) 38011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __throw_regex_error(regex_constants::error_ctype); 38111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (!__neg) 38211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_class_set |= __mask; 38311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert else 38411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_neg_class_set.push_back(__mask); 38511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifdef _GLIBCXX_DEBUG 38611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_is_ready = false; 38711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 38811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 38911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 39011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void 39111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_make_range(_CharT __l, _CharT __r) 39211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 39311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_range_set.push_back(make_pair(_M_translator._M_transform(__l), 39411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_translator._M_transform(__r))); 39511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifdef _GLIBCXX_DEBUG 39611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_is_ready = false; 39711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 39811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 39911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 40011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void 40111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_ready() 40211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 40311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_make_cache(_IsChar()); 40411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifdef _GLIBCXX_DEBUG 40511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_is_ready = true; 40611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 40711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 40811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 40911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert private: 41011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename is_same<_CharT, char>::type _IsChar; 41111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct _Dummy { }; 41211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename conditional<_IsChar::value, 41311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::bitset<1 << (8 * sizeof(_CharT))>, 41411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _Dummy>::type _CacheT; 41511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename make_unsigned<_CharT>::type _UnsignedCharT; 41611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 41711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert private: 41811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert bool 41911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_apply(_CharT __ch, false_type) const; 42011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 42111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert bool 42211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_apply(_CharT __ch, true_type) const 42311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return _M_cache[static_cast<_UnsignedCharT>(__ch)]; } 42411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 42511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void 42611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_make_cache(true_type) 42711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 42811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert for (int __i = 0; __i < _M_cache.size(); __i++) 42911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_cache[static_cast<_UnsignedCharT>(__i)] = 43011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_apply(__i, false_type()); 43111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 43211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 43311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void 43411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_make_cache(false_type) 43511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { } 43611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 43711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert private: 43811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _CacheT _M_cache; 43911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::vector<_CharT> _M_char_set; 44011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::vector<_StringT> _M_equiv_set; 44111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::vector<pair<_StrTransT, _StrTransT>> _M_range_set; 44211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::vector<_CharClassT> _M_neg_class_set; 44311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _CharClassT _M_class_set; 44411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _TransT _M_translator; 44511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _TraitsT& _M_traits; 44611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert bool _M_is_non_matching; 44711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifdef _GLIBCXX_DEBUG 44811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert bool _M_is_ready; 44911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 45011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert }; 45111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 45211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert //@} regex-detail 45311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_GLIBCXX_END_NAMESPACE_VERSION 45411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} // namespace __detail 45511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} // namespace std 45611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 45711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <bits/regex_compiler.tcc> 458