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

Last change on this file since 4415 was 4415, checked in by nmedfort, 4 years ago

More work on usedef info.

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