1*ccdc9c3eSSadaf Ebrahimi // Copyright 2009 The RE2 Authors. All Rights Reserved.
2*ccdc9c3eSSadaf Ebrahimi // Use of this source code is governed by a BSD-style
3*ccdc9c3eSSadaf Ebrahimi // license that can be found in the LICENSE file.
4*ccdc9c3eSSadaf Ebrahimi
5*ccdc9c3eSSadaf Ebrahimi #include "util/test.h"
6*ccdc9c3eSSadaf Ebrahimi #include "util/logging.h"
7*ccdc9c3eSSadaf Ebrahimi #include "re2/regexp.h"
8*ccdc9c3eSSadaf Ebrahimi #include "re2/walker-inl.h"
9*ccdc9c3eSSadaf Ebrahimi
10*ccdc9c3eSSadaf Ebrahimi namespace re2 {
11*ccdc9c3eSSadaf Ebrahimi
12*ccdc9c3eSSadaf Ebrahimi // Null walker. For benchmarking the walker itself.
13*ccdc9c3eSSadaf Ebrahimi
14*ccdc9c3eSSadaf Ebrahimi class NullWalker : public Regexp::Walker<bool> {
15*ccdc9c3eSSadaf Ebrahimi public:
NullWalker()16*ccdc9c3eSSadaf Ebrahimi NullWalker() { }
17*ccdc9c3eSSadaf Ebrahimi bool PostVisit(Regexp* re, bool parent_arg, bool pre_arg,
18*ccdc9c3eSSadaf Ebrahimi bool* child_args, int nchild_args);
19*ccdc9c3eSSadaf Ebrahimi
ShortVisit(Regexp * re,bool a)20*ccdc9c3eSSadaf Ebrahimi bool ShortVisit(Regexp* re, bool a) {
21*ccdc9c3eSSadaf Ebrahimi // Should never be called: we use Walk not WalkExponential.
22*ccdc9c3eSSadaf Ebrahimi LOG(DFATAL) << "NullWalker::ShortVisit called";
23*ccdc9c3eSSadaf Ebrahimi return a;
24*ccdc9c3eSSadaf Ebrahimi }
25*ccdc9c3eSSadaf Ebrahimi
26*ccdc9c3eSSadaf Ebrahimi private:
27*ccdc9c3eSSadaf Ebrahimi NullWalker(const NullWalker&) = delete;
28*ccdc9c3eSSadaf Ebrahimi NullWalker& operator=(const NullWalker&) = delete;
29*ccdc9c3eSSadaf Ebrahimi };
30*ccdc9c3eSSadaf Ebrahimi
31*ccdc9c3eSSadaf Ebrahimi // Called after visiting re's children. child_args contains the return
32*ccdc9c3eSSadaf Ebrahimi // value from each of the children's PostVisits (i.e., whether each child
33*ccdc9c3eSSadaf Ebrahimi // can match an empty string). Returns whether this clause can match an
34*ccdc9c3eSSadaf Ebrahimi // empty string.
PostVisit(Regexp * re,bool parent_arg,bool pre_arg,bool * child_args,int nchild_args)35*ccdc9c3eSSadaf Ebrahimi bool NullWalker::PostVisit(Regexp* re, bool parent_arg, bool pre_arg,
36*ccdc9c3eSSadaf Ebrahimi bool* child_args, int nchild_args) {
37*ccdc9c3eSSadaf Ebrahimi return false;
38*ccdc9c3eSSadaf Ebrahimi }
39*ccdc9c3eSSadaf Ebrahimi
40*ccdc9c3eSSadaf Ebrahimi // Returns whether re can match an empty string.
NullWalk()41*ccdc9c3eSSadaf Ebrahimi void Regexp::NullWalk() {
42*ccdc9c3eSSadaf Ebrahimi NullWalker w;
43*ccdc9c3eSSadaf Ebrahimi w.Walk(this, false);
44*ccdc9c3eSSadaf Ebrahimi }
45*ccdc9c3eSSadaf Ebrahimi
46*ccdc9c3eSSadaf Ebrahimi } // namespace re2
47