source: icGREP/icgrep-devel/icgrep/re/re_rep.cpp @ 5091

Last change on this file since 5091 was 4971, checked in by cameron, 3 years ago

Repetition of assertions are simplified

File size: 1.6 KB
Line 
1/*
2 *  Copyright (c) 2014 International Characters.
3 *  This software is licensed to the public under the Open Software License 3.0.
4 *  icgrep is a trademark of International Characters.
5 */
6
7#include "re_assertion.h"
8#include "re_rep.h"
9#include "re_seq.h"
10
11namespace re {
12
13inline int ubCombine(const int h1, const int h2) {
14    if ((h1 == Rep::UNBOUNDED_REP) || (h2 == Rep::UNBOUNDED_REP)) {
15        return Rep::UNBOUNDED_REP;
16    }
17    else {
18        return h1 * h2;
19    }
20}
21
22RE * makeRep(RE * re, const int lb, const int ub) {
23    if (Rep * rep = dyn_cast<Rep>(re)) {
24        if (rep->getUB() == Rep::UNBOUNDED_REP && ((lb > 0) || (rep->getLB() <= 1))) {
25            return new Rep(rep->getRE(), rep->getLB() * lb, Rep::UNBOUNDED_REP);
26        }
27        else if ((rep->getUB() == Rep::UNBOUNDED_REP) && (lb == 0)) {
28            return new Rep(rep, 0, 1);
29        }
30        else if (lb == ub) {
31            return new Rep(rep->getRE(), lb * rep->getLB(), ub * rep->getUB());
32        }
33        else if ((rep->getUB() * lb) >= (rep->getLB() * (lb + 1) - 1)) {
34            return new Rep(rep->getRE(), rep->getUB() * lb, ubCombine(rep->getUB(), ub));
35        }
36    }
37    else if (isa<Assertion>(re)) {
38        if (lb > 0) return re;
39        else return makeSeq();
40    }
41    else {
42        if (Seq * seq = dyn_cast<Seq>(re)) {
43            if (seq->empty()) {
44                return seq;
45            }
46        }
47        if ((lb == 0) && (ub == 0)) {
48            return makeSeq();
49        }
50        else if ((lb == 1) && (ub == 1)) {
51            return re;
52        }
53    }
54    return new Rep(re, lb, ub);
55}
56
57}
Note: See TracBrowser for help on using the repository browser.