1 // class template regex -*- C++ -*-
3 // Copyright (C) 2010-2013 Free Software Foundation, Inc.
5 // This file is part of the GNU ISO C++ Library. This library is free
6 // software; you can redistribute it and/or modify it under the
7 // terms of the GNU General Public License as published by the
8 // Free Software Foundation; either version 3, or (at your option)
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
16 // Under Section 7 of GPL version 3, you are granted additional
17 // permissions described in the GCC Runtime Library Exception, version
18 // 3.1, as published by the Free Software Foundation.
20 // You should have received a copy of the GNU General Public License and
21 // a copy of the GCC Runtime Library Exception along with this program;
22 // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
23 // <http://www.gnu.org/licenses/>.
26 * @file bits/regex_compiler.h
27 * This is an internal header file, included by other library headers.
28 * Do not attempt to use it directly. @headername{regex}
31 namespace std
_GLIBCXX_VISIBILITY(default)
35 _GLIBCXX_BEGIN_NAMESPACE_VERSION
38 * @addtogroup regex-detail
42 template<typename _CharT
, typename _TraitsT
>
43 struct _BracketMatcher
;
45 /// Builds an NFA from an input iterator interval.
46 template<typename _FwdIter
, typename _CharT
, typename _TraitsT
>
50 typedef typename
_TraitsT::string_type _StringT
;
51 typedef _NFA
<_CharT
, _TraitsT
> _RegexT
;
52 typedef regex_constants::syntax_option_type _FlagT
;
54 _Compiler(_FwdIter __b
, _FwdIter __e
,
55 const _TraitsT
& __traits
, _FlagT __flags
);
57 std::shared_ptr
<_RegexT
>
59 { return make_shared
<_RegexT
>(_M_nfa
); }
62 typedef _Scanner
<_FwdIter
> _ScannerT
;
63 typedef typename
_ScannerT::_TokenT _TokenT
;
64 typedef _StateSeq
<_CharT
, _TraitsT
> _StateSeqT
;
65 typedef std::stack
<_StateSeqT
, std::vector
<_StateSeqT
>> _StackT
;
66 typedef _BracketMatcher
<_CharT
, _TraitsT
> _BMatcherT
;
67 typedef std::ctype
<_CharT
> _CtypeT
;
69 // accepts a specific token or returns false.
71 _M_match_token(_TokenT __token
);
92 _M_bracket_expression();
95 _M_expression_term(_BMatcherT
& __matcher
);
98 _M_range_expression(_BMatcherT
& __matcher
);
101 _M_collating_symbol(_BMatcherT
& __matcher
);
104 _M_equivalence_class(_BMatcherT
& __matcher
);
107 _M_character_class(_BMatcherT
& __matcher
);
110 _M_cur_int_value(int __radix
);
118 auto ret
= _M_stack
.top();
124 const _TraitsT
& _M_traits
;
125 const _CtypeT
& _M_ctype
;
126 _ScannerT _M_scanner
;
132 template<typename _CharT
, typename _TraitsT
>
136 _AnyMatcher(const _TraitsT
& __traits
)
137 : _M_traits(__traits
)
141 operator()(_CharT __ch
) const
143 return _M_traits
.translate(__ch
) != '\n'
144 && _M_traits
.translate(__ch
) != '\r'
145 && _M_traits
.translate(__ch
) != u
'\u2028'
146 && _M_traits
.translate(__ch
) != u
'\u2029';
149 const _TraitsT
& _M_traits
;
152 template<typename _CharT
, typename _TraitsT
>
155 typedef regex_constants::syntax_option_type _FlagT
;
158 _CharMatcher(_CharT __ch
, const _TraitsT
& __traits
, _FlagT __flags
)
159 : _M_ch(_M_translate(__ch
)), _M_traits(__traits
), _M_flags(__flags
)
163 operator()(_CharT __ch
) const
164 { return _M_ch
== _M_translate(__ch
); }
167 _M_translate(_CharT __ch
) const
169 if (_M_flags
& regex_constants::icase
)
170 return _M_traits
.translate_nocase(__ch
);
172 return _M_traits
.translate(__ch
);
175 const _TraitsT
& _M_traits
;
180 /// Matches a character range (bracket expression)
181 template<typename _CharT
, typename _TraitsT
>
182 struct _BracketMatcher
184 typedef typename
_TraitsT::char_class_type _CharClassT
;
185 typedef typename
_TraitsT::string_type _StringT
;
186 typedef regex_constants::syntax_option_type _FlagT
;
189 _BracketMatcher(bool __is_non_matching
,
190 const _TraitsT
& __traits
,
192 : _M_is_non_matching(__is_non_matching
), _M_traits(__traits
),
193 _M_flags(__flags
), _M_class_set(0)
197 operator()(_CharT
) const;
200 _M_add_char(_CharT __c
)
201 { _M_char_set
.insert(_M_translate(__c
)); }
204 _M_add_collating_element(const _StringT
& __s
)
206 auto __st
= _M_traits
.lookup_collatename(__s
.data(),
207 __s
.data() + __s
.size());
209 __throw_regex_error(regex_constants::error_collate
);
210 _M_char_set
.insert(_M_translate(__st
[0]));
214 _M_add_equivalence_class(const _StringT
& __s
)
216 auto __st
= _M_traits
.lookup_collatename(__s
.data(),
217 __s
.data() + __s
.size());
219 __throw_regex_error(regex_constants::error_collate
);
220 __st
= _M_traits
.transform_primary(__st
.data(),
221 __st
.data() + __st
.size());
222 _M_equiv_set
.insert(__st
);
226 _M_add_character_class(const _StringT
& __s
)
228 auto __mask
= _M_traits
.lookup_classname(__s
.data(),
229 __s
.data() + __s
.size(),
232 __throw_regex_error(regex_constants::error_ctype
);
233 _M_class_set
|= __mask
;
237 _M_make_range(_CharT __l
, _CharT __r
)
239 if (_M_flags
& regex_constants::collate
)
241 make_pair(_M_get_str(_M_translate(__l
)),
242 _M_get_str(_M_translate(__r
))));
244 _M_range_set
.insert(make_pair(_M_get_str(__l
), _M_get_str(__r
)));
248 _M_translate(_CharT __c
) const
251 return _M_traits
.translate_nocase(__c
);
253 return _M_traits
.translate(__c
);
258 { return _M_flags
& regex_constants::icase
; }
261 _M_get_str(_CharT __c
) const
263 _StringT
__s(1, __c
);
264 return _M_traits
.transform(__s
.begin(), __s
.end());
267 std::set
<_CharT
> _M_char_set
;
268 std::set
<_StringT
> _M_equiv_set
;
269 std::set
<pair
<_StringT
, _StringT
>> _M_range_set
;
270 const _TraitsT
& _M_traits
;
271 _CharClassT _M_class_set
;
273 bool _M_is_non_matching
;
277 _GLIBCXX_END_NAMESPACE_VERSION
278 } // namespace __detail
281 #include <bits/regex_compiler.tcc>