Reimplemented from cmt_regexp_node_set.
Definition at line 823 of file cmt_regexp.cxx.
References cmt_regexp_node_set::_nodes, cmt_many_node::install(), cmt_regexp_node::is_char(), cmt_regexp_node::is_many_node(), cmt_vector< T >::push_back(), cmt_many_node::reduce(), cmt_string::size(), and cmt_vector< cmt_regexp_node * >::size().
Referenced by cmt_many_node::reduce().
00824 {
00825 if (_nodes.size () < 2) return;
00826
00827 char c = ' ';
00828 cmt_string s = "";
00829 cmt_vector new_nodes;
00830
00831
00832
00833
00834
00835 for (int i = 0; i <= _nodes.size (); i++)
00836 {
00837 cmt_regexp_node* n = 0;
00838
00839 if (i < _nodes.size ()) n = _nodes[i];
00840
00841 if ((i >= _nodes.size ()) || (!n->is_char ()))
00842 {
00843 if (s.size () == 1)
00844 {
00845
00846
00847
00848
00849 new_nodes.push_back (new cmt_char_node (c));
00850 s = "";
00851 }
00852 else if (s.size () > 1)
00853 {
00854
00855
00856
00857
00858 new_nodes.push_back (new cmt_string_node (s));
00859 s = "";
00860 }
00861
00862 if (i >= _nodes.size ()) break;
00863 }
00864
00865 if (n->is_char ())
00866 {
00867
00868
00869
00870 cmt_char_node& cn = *((cmt_char_node*) n);
00871 c = (char) cn;
00872 s += c;
00873 delete n;
00874 _nodes[i] = 0;
00875 }
00876 else if (n->is_many_node ())
00877 {
00878 cmt_many_node& mn = *((cmt_many_node*) n);
00879 mn.install (*this, i + 1);
00880 mn.reduce ();
00881 new_nodes.push_back (n);
00882 break;
00883 }
00884 else
00885 {
00886 new_nodes.push_back (n);
00887 }
00888 }
00889
00890 _nodes = new_nodes;
00891 }
|