31 namespace std _GLIBCXX_VISIBILITY(default)
35 _GLIBCXX_BEGIN_NAMESPACE_VERSION
43 case _S_opcode_alternative:
44 case _S_opcode_repeat:
45 ostr <<
"alt next=" << _M_next <<
" alt=" << _M_alt;
47 case _S_opcode_subexpr_begin:
48 ostr <<
"subexpr begin next=" << _M_next <<
" index=" << _M_subexpr;
50 case _S_opcode_subexpr_end:
51 ostr <<
"subexpr end next=" << _M_next <<
" index=" << _M_subexpr;
53 case _S_opcode_backref:
54 ostr <<
"backref next=" << _M_next <<
" index=" << _M_backref_index;
57 ostr <<
"match next=" << _M_next;
59 case _S_opcode_accept:
60 ostr <<
"accept next=" << _M_next;
63 ostr <<
"unknown next=" << _M_next;
71 _State_base::_M_dot(
std::ostream& __ostr, _StateIdT __id)
const 75 case _S_opcode_alternative:
76 case _S_opcode_repeat:
77 __ostr << __id <<
" [label=\"" << __id <<
"\\nALT\"];\n" 78 << __id <<
" -> " << _M_next
79 <<
" [label=\"next\", tailport=\"s\"];\n" 80 << __id <<
" -> " << _M_alt
81 <<
" [label=\"alt\", tailport=\"n\"];\n";
83 case _S_opcode_backref:
84 __ostr << __id <<
" [label=\"" << __id <<
"\\nBACKREF " 85 << _M_subexpr <<
"\"];\n" 86 << __id <<
" -> " << _M_next <<
" [label=\"<match>\"];\n";
88 case _S_opcode_line_begin_assertion:
89 __ostr << __id <<
" [label=\"" << __id <<
"\\nLINE_BEGIN \"];\n" 90 << __id <<
" -> " << _M_next <<
" [label=\"epsilon\"];\n";
92 case _S_opcode_line_end_assertion:
93 __ostr << __id <<
" [label=\"" << __id <<
"\\nLINE_END \"];\n" 94 << __id <<
" -> " << _M_next <<
" [label=\"epsilon\"];\n";
96 case _S_opcode_word_boundary:
97 __ostr << __id <<
" [label=\"" << __id <<
"\\nWORD_BOUNDRY " 99 << __id <<
" -> " << _M_next <<
" [label=\"epsilon\"];\n";
101 case _S_opcode_subexpr_lookahead:
102 __ostr << __id <<
" [label=\"" << __id <<
"\\nLOOK_AHEAD\"];\n" 103 << __id <<
" -> " << _M_next
104 <<
" [label=\"epsilon\", tailport=\"s\"];\n" 105 << __id <<
" -> " << _M_alt
106 <<
" [label=\"<assert>\", tailport=\"n\"];\n";
108 case _S_opcode_subexpr_begin:
109 __ostr << __id <<
" [label=\"" << __id <<
"\\nSBEGIN " 110 << _M_subexpr <<
"\"];\n" 111 << __id <<
" -> " << _M_next <<
" [label=\"epsilon\"];\n";
113 case _S_opcode_subexpr_end:
114 __ostr << __id <<
" [label=\"" << __id <<
"\\nSEND " 115 << _M_subexpr <<
"\"];\n" 116 << __id <<
" -> " << _M_next <<
" [label=\"epsilon\"];\n";
118 case _S_opcode_dummy:
120 case _S_opcode_match:
121 __ostr << __id <<
" [label=\"" << __id <<
"\\nMATCH\"];\n" 122 << __id <<
" -> " << _M_next <<
" [label=\"<match>\"];\n";
124 case _S_opcode_accept:
125 __ostr << __id <<
" [label=\"" << __id <<
"\\nACC\"];\n" ;
128 _GLIBCXX_DEBUG_ASSERT(
false);
134 template<
typename _TraitsT>
138 __ostr <<
"digraph _Nfa {\n" 140 for (
size_t __i = 0; __i < this->size(); ++__i)
141 (*
this)[__i]._M_dot(__ostr, __i);
147 template<
typename _TraitsT>
149 _NFA<_TraitsT>::_M_insert_backref(
size_t __index)
153 "Unexpected back-reference in polynomial mode.");
161 if (__index >= _M_subexpr_count)
164 "Back-reference index exceeds current sub-expression count.");
165 for (
auto __it : this->_M_paren_stack)
169 "Back-reference referred to an opened sub-expression.");
170 this->_M_has_backref =
true;
171 _StateT __tmp(_S_opcode_backref);
172 __tmp._M_backref_index = __index;
173 return _M_insert_state(std::move(__tmp));
176 template<
typename _TraitsT>
178 _NFA<_TraitsT>::_M_eliminate_dummy()
180 for (
auto& __it : *
this)
182 while (__it._M_next >= 0 && (*
this)[__it._M_next]._M_opcode()
184 __it._M_next = (*
this)[__it._M_next]._M_next;
185 if (__it._M_has_alt())
186 while (__it._M_alt >= 0 && (*
this)[__it._M_alt]._M_opcode()
188 __it._M_alt = (*
this)[__it._M_alt]._M_next;
193 template<
typename _TraitsT>
195 _StateSeq<_TraitsT>::_M_clone()
199 __stack.
push(_M_start);
200 while (!__stack.
empty())
202 auto __u = __stack.
top();
204 auto __dup = _M_nfa[__u];
206 auto __id = _M_nfa._M_insert_state(std::move(__dup));
208 if (__dup._M_has_alt())
209 if (__dup._M_alt != _S_invalid_state_id
210 && __m.
count(__dup._M_alt) == 0)
211 __stack.
push(__dup._M_alt);
214 if (__dup._M_next != _S_invalid_state_id
215 && __m.
count(__dup._M_next) == 0)
216 __stack.
push(__dup._M_next);
218 for (
auto __it : __m)
220 auto __v = __it.second;
221 auto& __ref = _M_nfa[__v];
222 if (__ref._M_next != _S_invalid_state_id)
224 __glibcxx_assert(__m.count(__ref._M_next) > 0);
225 __ref._M_next = __m[__ref._M_next];
227 if (__ref._M_has_alt())
228 if (__ref._M_alt != _S_invalid_state_id)
230 __glibcxx_assert(__m.count(__ref._M_alt) > 0);
231 __ref._M_alt = __m[__ref._M_alt];
234 return _StateSeq(_M_nfa, __m[_M_start], __m[_M_end]);
237 _GLIBCXX_END_NAMESPACE_VERSION
void pop()
Removes first element.
void push(const value_type &__x)
Add data to the top of the stack.
constexpr error_type error_complexity(_S_error_complexity)
constexpr error_type error_backref(_S_error_backref)
A standard container giving FILO behavior.
_GLIBCXX17_INLINE constexpr syntax_option_type __polynomial
A standard container made up of (key,value) pairs, which can be retrieved based on a key...
ISO C++ entities toplevel namespace is std.
size_type count(const key_type &__x) const
Finds the number of elements with given key.