1*e4b17023SJohn Marino // class template regex -*- C++ -*-
2*e4b17023SJohn Marino
3*e4b17023SJohn Marino // Copyright (C) 2010, 2011 Free Software Foundation, Inc.
4*e4b17023SJohn Marino //
5*e4b17023SJohn Marino // This file is part of the GNU ISO C++ Library. This library is free
6*e4b17023SJohn Marino // software; you can redistribute it and/or modify it under the
7*e4b17023SJohn Marino // terms of the GNU General Public License as published by the
8*e4b17023SJohn Marino // Free Software Foundation; either version 3, or (at your option)
9*e4b17023SJohn Marino // any later version.
10*e4b17023SJohn Marino
11*e4b17023SJohn Marino // This library is distributed in the hope that it will be useful,
12*e4b17023SJohn Marino // but WITHOUT ANY WARRANTY; without even the implied warranty of
13*e4b17023SJohn Marino // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14*e4b17023SJohn Marino // GNU General Public License for more details.
15*e4b17023SJohn Marino
16*e4b17023SJohn Marino // Under Section 7 of GPL version 3, you are granted additional
17*e4b17023SJohn Marino // permissions described in the GCC Runtime Library Exception, version
18*e4b17023SJohn Marino // 3.1, as published by the Free Software Foundation.
19*e4b17023SJohn Marino
20*e4b17023SJohn Marino // You should have received a copy of the GNU General Public License and
21*e4b17023SJohn Marino // a copy of the GCC Runtime Library Exception along with this program;
22*e4b17023SJohn Marino // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
23*e4b17023SJohn Marino // <http://www.gnu.org/licenses/>.
24*e4b17023SJohn Marino
25*e4b17023SJohn Marino /**
26*e4b17023SJohn Marino * @file bits/regex_nfa.tcc
27*e4b17023SJohn Marino * This is an internal header file, included by other library headers.
28*e4b17023SJohn Marino * Do not attempt to use it directly. @headername{regex}
29*e4b17023SJohn Marino */
30*e4b17023SJohn Marino #include <regex>
31*e4b17023SJohn Marino
32*e4b17023SJohn Marino namespace std _GLIBCXX_VISIBILITY(default)
33*e4b17023SJohn Marino {
34*e4b17023SJohn Marino namespace __regex
35*e4b17023SJohn Marino {
36*e4b17023SJohn Marino _GLIBCXX_BEGIN_NAMESPACE_VERSION
37*e4b17023SJohn Marino
38*e4b17023SJohn Marino #ifdef _GLIBCXX_DEBUG
39*e4b17023SJohn Marino inline std::ostream& _State::
_M_print(std::ostream & ostr) const40*e4b17023SJohn Marino _M_print(std::ostream& ostr) const
41*e4b17023SJohn Marino {
42*e4b17023SJohn Marino switch (_M_opcode)
43*e4b17023SJohn Marino {
44*e4b17023SJohn Marino case _S_opcode_alternative:
45*e4b17023SJohn Marino ostr << "alt next=" << _M_next << " alt=" << _M_alt;
46*e4b17023SJohn Marino break;
47*e4b17023SJohn Marino case _S_opcode_subexpr_begin:
48*e4b17023SJohn Marino ostr << "subexpr begin next=" << _M_next << " index=" << _M_subexpr;
49*e4b17023SJohn Marino break;
50*e4b17023SJohn Marino case _S_opcode_subexpr_end:
51*e4b17023SJohn Marino ostr << "subexpr end next=" << _M_next << " index=" << _M_subexpr;
52*e4b17023SJohn Marino break;
53*e4b17023SJohn Marino case _S_opcode_match:
54*e4b17023SJohn Marino ostr << "match next=" << _M_next;
55*e4b17023SJohn Marino break;
56*e4b17023SJohn Marino case _S_opcode_accept:
57*e4b17023SJohn Marino ostr << "accept next=" << _M_next;
58*e4b17023SJohn Marino break;
59*e4b17023SJohn Marino default:
60*e4b17023SJohn Marino ostr << "unknown next=" << _M_next;
61*e4b17023SJohn Marino break;
62*e4b17023SJohn Marino }
63*e4b17023SJohn Marino return ostr;
64*e4b17023SJohn Marino }
65*e4b17023SJohn Marino
66*e4b17023SJohn Marino // Prints graphviz dot commands for state.
67*e4b17023SJohn Marino inline std::ostream& _State::
_M_dot(std::ostream & __ostr,_StateIdT __id) const68*e4b17023SJohn Marino _M_dot(std::ostream& __ostr, _StateIdT __id) const
69*e4b17023SJohn Marino {
70*e4b17023SJohn Marino switch (_M_opcode)
71*e4b17023SJohn Marino {
72*e4b17023SJohn Marino case _S_opcode_alternative:
73*e4b17023SJohn Marino __ostr << __id << " [label=\"" << __id << "\\nALT\"];\n"
74*e4b17023SJohn Marino << __id << " -> " << _M_next
75*e4b17023SJohn Marino << " [label=\"epsilon\", tailport=\"s\"];\n"
76*e4b17023SJohn Marino << __id << " -> " << _M_alt
77*e4b17023SJohn Marino << " [label=\"epsilon\", tailport=\"n\"];\n";
78*e4b17023SJohn Marino break;
79*e4b17023SJohn Marino case _S_opcode_subexpr_begin:
80*e4b17023SJohn Marino __ostr << __id << " [label=\"" << __id << "\\nSBEGIN "
81*e4b17023SJohn Marino << _M_subexpr << "\"];\n"
82*e4b17023SJohn Marino << __id << " -> " << _M_next << " [label=\"epsilon\"];\n";
83*e4b17023SJohn Marino break;
84*e4b17023SJohn Marino case _S_opcode_subexpr_end:
85*e4b17023SJohn Marino __ostr << __id << " [label=\"" << __id << "\\nSEND "
86*e4b17023SJohn Marino << _M_subexpr << "\"];\n"
87*e4b17023SJohn Marino << __id << " -> " << _M_next << " [label=\"epsilon\"];\n";
88*e4b17023SJohn Marino break;
89*e4b17023SJohn Marino case _S_opcode_match:
90*e4b17023SJohn Marino __ostr << __id << " [label=\"" << __id << "\\nMATCH\"];\n"
91*e4b17023SJohn Marino << __id << " -> " << _M_next << " [label=\"<match>\"];\n";
92*e4b17023SJohn Marino break;
93*e4b17023SJohn Marino case _S_opcode_accept:
94*e4b17023SJohn Marino __ostr << __id << " [label=\"" << __id << "\\nACC\"];\n" ;
95*e4b17023SJohn Marino break;
96*e4b17023SJohn Marino default:
97*e4b17023SJohn Marino __ostr << __id << " [label=\"" << __id << "\\nUNK\"];\n"
98*e4b17023SJohn Marino << __id << " -> " << _M_next << " [label=\"?\"];\n";
99*e4b17023SJohn Marino break;
100*e4b17023SJohn Marino }
101*e4b17023SJohn Marino return __ostr;
102*e4b17023SJohn Marino }
103*e4b17023SJohn Marino
104*e4b17023SJohn Marino inline std::ostream& _Nfa::
_M_dot(std::ostream & __ostr) const105*e4b17023SJohn Marino _M_dot(std::ostream& __ostr) const
106*e4b17023SJohn Marino {
107*e4b17023SJohn Marino __ostr << "digraph _Nfa {\n"
108*e4b17023SJohn Marino << " rankdir=LR;\n";
109*e4b17023SJohn Marino for (unsigned int __i = 0; __i < this->size(); ++__i)
110*e4b17023SJohn Marino { this->at(__i)._M_dot(__ostr, __i); }
111*e4b17023SJohn Marino __ostr << "}\n";
112*e4b17023SJohn Marino return __ostr;
113*e4b17023SJohn Marino }
114*e4b17023SJohn Marino #endif
115*e4b17023SJohn Marino
116*e4b17023SJohn Marino inline _StateSeq& _StateSeq::
operator =(const _StateSeq & __rhs)117*e4b17023SJohn Marino operator=(const _StateSeq& __rhs)
118*e4b17023SJohn Marino {
119*e4b17023SJohn Marino _M_start = __rhs._M_start;
120*e4b17023SJohn Marino _M_end1 = __rhs._M_end1;
121*e4b17023SJohn Marino _M_end2 = __rhs._M_end2;
122*e4b17023SJohn Marino return *this;
123*e4b17023SJohn Marino }
124*e4b17023SJohn Marino
125*e4b17023SJohn Marino inline void _StateSeq::
_M_push_back(_StateIdT __id)126*e4b17023SJohn Marino _M_push_back(_StateIdT __id)
127*e4b17023SJohn Marino {
128*e4b17023SJohn Marino if (_M_end1 != _S_invalid_state_id)
129*e4b17023SJohn Marino _M_nfa[_M_end1]._M_next = __id;
130*e4b17023SJohn Marino _M_end1 = __id;
131*e4b17023SJohn Marino }
132*e4b17023SJohn Marino
133*e4b17023SJohn Marino inline void _StateSeq::
_M_append(_StateIdT __id)134*e4b17023SJohn Marino _M_append(_StateIdT __id)
135*e4b17023SJohn Marino {
136*e4b17023SJohn Marino if (_M_end2 != _S_invalid_state_id)
137*e4b17023SJohn Marino {
138*e4b17023SJohn Marino if (_M_end2 == _M_end1)
139*e4b17023SJohn Marino _M_nfa[_M_end2]._M_alt = __id;
140*e4b17023SJohn Marino else
141*e4b17023SJohn Marino _M_nfa[_M_end2]._M_next = __id;
142*e4b17023SJohn Marino _M_end2 = _S_invalid_state_id;
143*e4b17023SJohn Marino }
144*e4b17023SJohn Marino if (_M_end1 != _S_invalid_state_id)
145*e4b17023SJohn Marino _M_nfa[_M_end1]._M_next = __id;
146*e4b17023SJohn Marino _M_end1 = __id;
147*e4b17023SJohn Marino }
148*e4b17023SJohn Marino
149*e4b17023SJohn Marino inline void _StateSeq::
_M_append(_StateSeq & __rhs)150*e4b17023SJohn Marino _M_append(_StateSeq& __rhs)
151*e4b17023SJohn Marino {
152*e4b17023SJohn Marino if (_M_end2 != _S_invalid_state_id)
153*e4b17023SJohn Marino {
154*e4b17023SJohn Marino if (_M_end2 == _M_end1)
155*e4b17023SJohn Marino _M_nfa[_M_end2]._M_alt = __rhs._M_start;
156*e4b17023SJohn Marino else
157*e4b17023SJohn Marino _M_nfa[_M_end2]._M_next = __rhs._M_start;
158*e4b17023SJohn Marino _M_end2 = _S_invalid_state_id;
159*e4b17023SJohn Marino }
160*e4b17023SJohn Marino if (__rhs._M_end2 != _S_invalid_state_id)
161*e4b17023SJohn Marino _M_end2 = __rhs._M_end2;
162*e4b17023SJohn Marino if (_M_end1 != _S_invalid_state_id)
163*e4b17023SJohn Marino _M_nfa[_M_end1]._M_next = __rhs._M_start;
164*e4b17023SJohn Marino _M_end1 = __rhs._M_end1;
165*e4b17023SJohn Marino }
166*e4b17023SJohn Marino
167*e4b17023SJohn Marino // @todo implement this function.
168*e4b17023SJohn Marino inline _StateIdT _StateSeq::
_M_clone()169*e4b17023SJohn Marino _M_clone()
170*e4b17023SJohn Marino { return 0; }
171*e4b17023SJohn Marino
172*e4b17023SJohn Marino _GLIBCXX_END_NAMESPACE_VERSION
173*e4b17023SJohn Marino } // namespace __regex
174*e4b17023SJohn Marino } // namespace
175