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

Last change on this file since 4405 was 4405, checked in by cameron, 5 years ago

AST support for Lookahead/Lookbehind? assertions

File size: 2.4 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
14namespace re {
15
16bool isByteLength(RE * re) {
17    if (Alt * alt = dyn_cast<Alt>(re)) {
18        std::vector<RE*> list;
19        for (RE * re : *alt) {
20            if (!isByteLength(re)) return false;
21        }
22        return true;
23    }
24    else if (Seq * seq = dyn_cast<Seq>(re)) {
25        return (seq->size() == 1) && isByteLength(&seq[0]);
26    }
27    else if (Rep * rep = dyn_cast<Rep>(re)) {
28        return (rep->getLB() == 1) && (rep->getUB() == 1) && isByteLength(rep->getRE());
29    }
30    else if (Assertion * a = dyn_cast<Assertion>(re)) {
31        return false;
32    }
33    else if (Diff * diff = dyn_cast<Diff>(re)) {
34        return isByteLength(diff->getLH()) && isByteLength(diff->getRH());
35    }
36    else if (Intersect * e = dyn_cast<Intersect>(re)) {
37        return isByteLength(e->getLH()) && isByteLength(e->getRH());
38    }
39    else if (isa<Any>(re)) return false;
40    else if (Name * n = dyn_cast<Name>(re)) {
41        return (n->getType() == Name::Type::Byte);
42    }
43    return false; // otherwise
44}
45
46bool isUnicodeUnitLength(RE * re) {
47    if (Alt * alt = dyn_cast<Alt>(re)) {
48        std::vector<RE*> list;
49        for (RE * re : *alt) {
50            if (!isUnicodeUnitLength(re)) return false;
51        }
52        return true;
53    }
54    else if (Seq * seq = dyn_cast<Seq>(re)) {
55        return (seq->size() == 1) && isUnicodeUnitLength(&seq[0]);
56    }
57    else if (Rep * rep = dyn_cast<Rep>(re)) {
58        return (rep->getLB() == 1) && (rep->getUB() == 1) && isUnicodeUnitLength(rep->getRE());
59    }
60    else if (Assertion * a = dyn_cast<Assertion>(re)) {
61        return false;
62    }
63    else if (Diff * diff = dyn_cast<Diff>(re)) {
64        return isUnicodeUnitLength(diff->getLH()) && isUnicodeUnitLength(diff->getRH());
65    }
66    else if (Intersect * e = dyn_cast<Intersect>(re)) {
67        return isUnicodeUnitLength(e->getLH()) && isUnicodeUnitLength(e->getRH());
68    }
69    else if (isa<Any>(re)) return true;
70    else if (Name * n = dyn_cast<Name>(re)) {
71        // Eventually names might be set up for not unit length items.
72        return (n->getType() == Name::Type::Unicode || n->getType() == Name::Type::UnicodeProperty || n->getType() == Name::Type::Byte);
73    }
74    return false; // otherwise
75}
76   
77}
Note: See TracBrowser for help on using the repository browser.