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

Last change on this file since 5371 was 5267, checked in by nmedfort, 3 years ago

Code clean-up. Removed Pablo Call, SetIthBit? and Prototype.

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_rep.h"
8#include "re_assertion.h"
9#include "re_seq.h"
10#include <llvm/Support/Casting.h>
11
12using namespace llvm;
13
14namespace re {
15
16inline int ubCombine(const int h1, const int h2) {
17    if ((h1 == Rep::UNBOUNDED_REP) || (h2 == Rep::UNBOUNDED_REP)) {
18        return Rep::UNBOUNDED_REP;
19    }
20    else {
21        return h1 * h2;
22    }
23}
24
25RE * makeRep(RE * re, const int lb, const int ub) {
26    if (Rep * rep = dyn_cast<Rep>(re)) {
27        if (rep->getUB() == Rep::UNBOUNDED_REP && ((lb > 0) || (rep->getLB() <= 1))) {
28            return new Rep(rep->getRE(), rep->getLB() * lb, Rep::UNBOUNDED_REP);
29        }
30        else if ((rep->getUB() == Rep::UNBOUNDED_REP) && (lb == 0)) {
31            return new Rep(rep, 0, 1);
32        }
33        else if (lb == ub) {
34            return new Rep(rep->getRE(), lb * rep->getLB(), ub * rep->getUB());
35        }
36        else if ((rep->getUB() * lb) >= (rep->getLB() * (lb + 1) - 1)) {
37            return new Rep(rep->getRE(), rep->getUB() * lb, ubCombine(rep->getUB(), ub));
38        }
39    }
40    else if (isa<Assertion>(re)) {
41        if (lb > 0) return re;
42        else return makeSeq();
43    }
44    else {
45        if (Seq * seq = dyn_cast<Seq>(re)) {
46            if (seq->empty()) {
47                return seq;
48            }
49        }
50        if ((lb == 0) && (ub == 0)) {
51            return makeSeq();
52        }
53        else if ((lb == 1) && (ub == 1)) {
54            return re;
55        }
56    }
57    return new Rep(re, lb, ub);
58}
59
60}
Note: See TracBrowser for help on using the repository browser.