source: icGREP/icgrep-devel/icgrep/re/re_analysis.cpp @ 4442

Last change on this file since 4442 was 4442, checked in by cameron, 4 years ago

Simple if-insertion strategy at starDepth 0

File size: 3.5 KB
Line 
1#include "re_analysis.h"
2#include "re_cc.h"
3#include "re_name.h"
4#include "re_start.h"
5#include "re_end.h"
6#include "re_any.h"
7#include "re_seq.h"
8#include "re_alt.h"
9#include "re_rep.h"
10#include "re_diff.h"
11#include "re_intersect.h"
12#include "re_assertion.h"
13#include <limits.h>
14
15namespace re {
16
17bool isByteLength(RE * re) {
18    if (Alt * alt = dyn_cast<Alt>(re)) {
19        for (RE * re : *alt) {
20            if (!isByteLength(re)) {
21                return false;
22            }
23        }
24        return true;
25    }
26    else if (Seq * seq = dyn_cast<Seq>(re)) {
27        return (seq->size() == 1) && isByteLength(&seq[0]);
28    }
29    else if (Rep * rep = dyn_cast<Rep>(re)) {
30        return (rep->getLB() == 1) && (rep->getUB() == 1) && isByteLength(rep->getRE());
31    }
32    else if (isa<Assertion>(re)) {
33        return false;
34    }
35    else if (Diff * diff = dyn_cast<Diff>(re)) {
36        return isByteLength(diff->getLH()) && isByteLength(diff->getRH());
37    }
38    else if (Intersect * e = dyn_cast<Intersect>(re)) {
39        return isByteLength(e->getLH()) && isByteLength(e->getRH());
40    }
41    else if (isa<Any>(re)) {
42        return false;
43    }
44    else if (Name * n = dyn_cast<Name>(re)) {
45        return (n->getType() == Name::Type::Byte);
46    }
47    return false; // otherwise
48}
49
50bool isUnicodeUnitLength(RE * re) {
51    if (Alt * alt = dyn_cast<Alt>(re)) {
52        for (RE * re : *alt) {
53            if (!isUnicodeUnitLength(re)) {
54                return false;
55            }
56        }
57        return true;
58    }
59    else if (Seq * seq = dyn_cast<Seq>(re)) {
60        return (seq->size() == 1) && isUnicodeUnitLength(&seq[0]);
61    }
62    else if (Rep * rep = dyn_cast<Rep>(re)) {
63        return (rep->getLB() == 1) && (rep->getUB() == 1) && isUnicodeUnitLength(rep->getRE());
64    }
65    else if (isa<Assertion>(re)) {
66        return false;
67    }
68    else if (Diff * diff = dyn_cast<Diff>(re)) {
69        return isUnicodeUnitLength(diff->getLH()) && isUnicodeUnitLength(diff->getRH());
70    }
71    else if (Intersect * e = dyn_cast<Intersect>(re)) {
72        return isUnicodeUnitLength(e->getLH()) && isUnicodeUnitLength(e->getRH());
73    }
74    else if (isa<Any>(re)) {
75        return true;
76    }
77    else if (Name * n = dyn_cast<Name>(re)) {
78        // Eventually names might be set up for not unit length items.
79        return (n->getType() == Name::Type::Unicode || n->getType() == Name::Type::UnicodeProperty || n->getType() == Name::Type::Byte);
80    }
81    return false; // otherwise
82}
83   
84int minMatchLength(RE * re) {
85    if (Alt * alt = dyn_cast<Alt>(re)) {
86        int minAltLength = INT_MAX;
87        for (RE * re : *alt) {
88            minAltLength = std::min(minAltLength, minMatchLength(re));
89        }
90        return minAltLength;
91    }
92    else if (Seq * seq = dyn_cast<Seq>(re)) {
93        int minSeqLength = 0;
94        for (RE * re : *seq) {
95            minSeqLength += minMatchLength(re);
96        }
97        return minSeqLength;
98    }
99    else if (Rep * rep = dyn_cast<Rep>(re)) {
100        if (rep->getLB() == 0) return 0;
101        else return (rep->getLB()) * minMatchLength(rep->getRE());
102    }
103    else if (isa<Assertion>(re)) {
104        return 0;
105    }
106    else if (Diff * diff = dyn_cast<Diff>(re)) {
107        return minMatchLength(diff->getLH());
108    }
109    else if (Intersect * e = dyn_cast<Intersect>(re)) {
110        return std::min(minMatchLength(e->getLH()), minMatchLength(e->getRH()));
111    }
112    else if (isa<Any>(re)) {
113        return 1;
114    }
115    else if (isa<Name>(re)) {
116        return 1;
117    }
118    return 0; // otherwise
119}
120
121
122}
Note: See TracBrowser for help on using the repository browser.