Lines Matching full:re
5 // Rewrite POSIX and other features in re
26 Regexp* re = Parse(src, flags, status); in SimplifyRegexp() local
27 if (re == NULL) in SimplifyRegexp()
29 Regexp* sre = re->Simplify(); in SimplifyRegexp()
30 re->Decref(); in SimplifyRegexp()
112 virtual Regexp* PostVisit(Regexp* re, Regexp* parent_arg, Regexp* pre_arg,
114 virtual Regexp* Copy(Regexp* re);
115 virtual Regexp* ShortVisit(Regexp* re, Regexp* parent_arg);
142 virtual Regexp* PreVisit(Regexp* re, Regexp* parent_arg, bool* stop);
143 virtual Regexp* PostVisit(Regexp* re, Regexp* parent_arg, Regexp* pre_arg,
145 virtual Regexp* Copy(Regexp* re);
146 virtual Regexp* ShortVisit(Regexp* re, Regexp* parent_arg);
156 // Simplifies the expression re{min,max} in terms of *, +, and ?.
157 // Returns a new regexp. Does not edit re. Does not consume reference to re.
159 static Regexp* SimplifyRepeat(Regexp* re, int min, int max,
163 // into rune ranges. Does not edit re. Does not consume ref to re.
165 static Regexp* SimplifyCharClass(Regexp* re);
193 // Utility function for PostVisit implementations that compares re->sub() with
196 // so PostVisit must return re->Incref(). Otherwise, returns true.
197 static bool ChildArgsChanged(Regexp* re, Regexp** child_args) { in ChildArgsChanged() argument
198 for (int i = 0; i < re->nsub(); i++) { in ChildArgsChanged()
199 Regexp* sub = re->sub()[i]; in ChildArgsChanged()
204 for (int i = 0; i < re->nsub(); i++) { in ChildArgsChanged()
211 Regexp* CoalesceWalker::Copy(Regexp* re) { in Copy() argument
212 return re->Incref(); in Copy()
215 Regexp* CoalesceWalker::ShortVisit(Regexp* re, Regexp* parent_arg) { in ShortVisit() argument
219 return re->Incref(); in ShortVisit()
222 Regexp* CoalesceWalker::PostVisit(Regexp* re, in PostVisit() argument
227 if (re->nsub() == 0) in PostVisit()
228 return re->Incref(); in PostVisit()
230 if (re->op() != kRegexpConcat) { in PostVisit()
231 if (!ChildArgsChanged(re, child_args)) in PostVisit()
232 return re->Incref(); in PostVisit()
235 Regexp* nre = new Regexp(re->op(), re->parse_flags()); in PostVisit()
236 nre->AllocSub(re->nsub()); in PostVisit()
238 for (int i = 0; i < re->nsub(); i++) in PostVisit()
241 if (re->op() == kRegexpRepeat) { in PostVisit()
242 nre->min_ = re->min(); in PostVisit()
243 nre->max_ = re->max(); in PostVisit()
244 } else if (re->op() == kRegexpCapture) { in PostVisit()
245 nre->cap_ = re->cap(); in PostVisit()
251 for (int i = 0; i < re->nsub(); i++) { in PostVisit()
252 if (i+1 < re->nsub() && in PostVisit()
259 if (!ChildArgsChanged(re, child_args)) in PostVisit()
260 return re->Incref(); in PostVisit()
263 Regexp* nre = new Regexp(re->op(), re->parse_flags()); in PostVisit()
264 nre->AllocSub(re->nsub()); in PostVisit()
266 for (int i = 0; i < re->nsub(); i++) in PostVisit()
271 for (int i = 0; i < re->nsub(); i++) { in PostVisit()
272 if (i+1 < re->nsub() && in PostVisit()
278 for (int i = n; i < re->nsub(); i++) { in PostVisit()
283 Regexp* nre = new Regexp(re->op(), re->parse_flags()); in PostVisit()
284 nre->AllocSub(re->nsub() - n); in PostVisit()
286 for (int i = 0, j = 0; i < re->nsub(); i++) { in PostVisit()
436 Regexp* SimplifyWalker::Copy(Regexp* re) { in Copy() argument
437 return re->Incref(); in Copy()
440 Regexp* SimplifyWalker::ShortVisit(Regexp* re, Regexp* parent_arg) { in ShortVisit() argument
444 return re->Incref(); in ShortVisit()
447 Regexp* SimplifyWalker::PreVisit(Regexp* re, Regexp* parent_arg, bool* stop) { in PreVisit() argument
448 if (re->simple()) { in PreVisit()
450 return re->Incref(); in PreVisit()
455 Regexp* SimplifyWalker::PostVisit(Regexp* re, in PostVisit() argument
460 switch (re->op()) { in PostVisit()
475 re->simple_ = true; in PostVisit()
476 return re->Incref(); in PostVisit()
481 if (!ChildArgsChanged(re, child_args)) { in PostVisit()
482 re->simple_ = true; in PostVisit()
483 return re->Incref(); in PostVisit()
485 Regexp* nre = new Regexp(re->op(), re->parse_flags()); in PostVisit()
486 nre->AllocSub(re->nsub()); in PostVisit()
488 for (int i = 0; i < re->nsub(); i++) in PostVisit()
496 if (newsub == re->sub()[0]) { in PostVisit()
498 re->simple_ = true; in PostVisit()
499 return re->Incref(); in PostVisit()
501 Regexp* nre = new Regexp(kRegexpCapture, re->parse_flags()); in PostVisit()
504 nre->cap_ = re->cap(); in PostVisit()
519 if (newsub == re->sub()[0]) { in PostVisit()
521 re->simple_ = true; in PostVisit()
522 return re->Incref(); in PostVisit()
526 if (re->op() == newsub->op() && in PostVisit()
527 re->parse_flags() == newsub->parse_flags()) in PostVisit()
530 Regexp* nre = new Regexp(re->op(), re->parse_flags()); in PostVisit()
544 Regexp* nre = SimplifyRepeat(newsub, re->min_, re->max_, in PostVisit()
545 re->parse_flags()); in PostVisit()
552 Regexp* nre = SimplifyCharClass(re); in PostVisit()
558 LOG(ERROR) << "Simplify case not handled: " << re->op(); in PostVisit()
559 return re->Incref(); in PostVisit()
566 Regexp* re = new Regexp(kRegexpConcat, parse_flags); in Concat2() local
567 re->AllocSub(2); in Concat2()
568 Regexp** subs = re->sub(); in Concat2()
571 return re; in Concat2()
574 // Simplifies the expression re{min,max} in terms of *, +, and ?.
575 // Returns a new regexp. Does not edit re. Does not consume reference to re.
578 // if you call ToString() and re-parse it: (x){2} becomes (x)(x),
580 Regexp* SimplifyWalker::SimplifyRepeat(Regexp* re, int min, int max, in SimplifyRepeat() argument
586 return Regexp::Star(re->Incref(), f); in SimplifyRepeat()
590 return Regexp::Plus(re->Incref(), f); in SimplifyRepeat()
595 nre_subs[i] = re->Incref(); in SimplifyRepeat()
596 nre_subs[min-1] = Regexp::Plus(re->Incref(), f); in SimplifyRepeat()
606 return re->Incref(); in SimplifyRepeat()
617 nre_subs[i] = re->Incref(); in SimplifyRepeat()
623 Regexp* suf = Regexp::Quest(re->Incref(), f); in SimplifyRepeat()
625 suf = Regexp::Quest(Concat2(re->Incref(), suf, f), f); in SimplifyRepeat()
635 LOG(DFATAL) << "Malformed repeat " << re->ToString() << " " << min << " " << max; in SimplifyRepeat()
644 Regexp* SimplifyWalker::SimplifyCharClass(Regexp* re) { in SimplifyCharClass() argument
645 CharClass* cc = re->cc(); in SimplifyCharClass()
649 return new Regexp(kRegexpNoMatch, re->parse_flags()); in SimplifyCharClass()
651 return new Regexp(kRegexpAnyChar, re->parse_flags()); in SimplifyCharClass()
653 return re->Incref(); in SimplifyCharClass()