source: icGREP/icgrep-devel/icgrep/re/re_collect_unicodesets.cpp @ 5789

Last change on this file since 5789 was 5772, checked in by cameron, 23 months ago

resolveGraphemeMode

File size: 1.7 KB
Line 
1#include "re_collect_unicodesets.h"
2#include <re/re_name.h>
3#include <re/re_any.h>
4#include <re/re_alt.h>
5#include <re/re_cc.h>
6#include <re/re_seq.h>
7#include <re/re_rep.h>
8#include <re/re_range.h>
9#include <re/re_diff.h>
10#include <re/re_intersect.h>
11#include <re/re_assertion.h>
12#include <boost/container/flat_set.hpp>
13
14
15using namespace llvm;
16
17namespace re {
18   
19struct SetCollector {
20    void collect(RE * const re);
21public:
22    std::vector<const CC *> UnicodeSets;
23    boost::container::flat_set<const RE *>  Visited;
24};
25
26void SetCollector::collect(RE * const re) {
27    assert ("RE object cannot be null!" && re);
28    if (Visited.insert(re).second) {
29        if (CC * cc = dyn_cast<CC>(re)) {
30            UnicodeSets.push_back(cc);
31        } else if (isa<Name>(re)) {
32            auto def = cast<Name>(re)->getDefinition();
33            if (def != nullptr)
34                collect(def);
35        } else if (isa<Seq>(re)) {
36            for (auto item : *cast<Seq>(re)) {
37                collect(item);
38            }
39        } else if (isa<Alt>(re)) {
40            for (auto item : *cast<Alt>(re)) {
41                collect(item);
42            }
43        } else if (isa<Rep>(re)) {
44            collect(cast<Rep>(re)->getRE());
45        } else if (isa<Assertion>(re)) {
46            collect(cast<Assertion>(re)->getAsserted());
47        } else if (isa<Diff>(re)) {
48            collect(cast<Diff>(re)->getLH());
49            collect(cast<Diff>(re)->getRH());
50        } else if (isa<Intersect>(re)) {
51            collect(cast<Intersect>(re)->getLH());
52            collect(cast<Intersect>(re)->getRH());
53        }
54    }
55}
56
57std::vector<const CC *> collectUnicodeSets(RE * const re) {
58    SetCollector collector;
59    collector.collect(re);
60    return collector.UnicodeSets;
61}
62
63
64
65}
Note: See TracBrowser for help on using the repository browser.