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

Last change on this file since 5881 was 5881, checked in by cameron, 12 months ago

Grapheme Cluster Break kernel

File size: 2.2 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 <cc/alphabet.h>
13#include <boost/container/flat_set.hpp>
14#include <llvm/Support/raw_ostream.h>
15
16using namespace llvm;
17
18namespace re {
19   
20struct SetCollector {
21    void collect(RE * const re);
22public:
23    std::vector<const CC *> UnicodeSets;
24    boost::container::flat_set<const RE *>  Visited;
25    std::set<Name *> ignoredExternals;
26};
27
28void SetCollector::collect(RE * const re) {
29    assert ("RE object cannot be null!" && re);
30    if (Visited.insert(re).second) {
31        if (CC * cc = dyn_cast<CC>(re)) {
32            if (cc->getAlphabet() == &cc::Unicode) {
33                const auto index = find(UnicodeSets.begin(), UnicodeSets.end(), cc) - UnicodeSets.begin();
34                if (index == UnicodeSets.size()) UnicodeSets.push_back(cc);
35            }
36        } else if (isa<Name>(re)) {
37            if (ignoredExternals.find(cast<Name>(re)) != ignoredExternals.end()) return;
38            auto def = cast<Name>(re)->getDefinition();
39            if (def != nullptr)
40                collect(def);
41        } else if (isa<Seq>(re)) {
42            for (auto item : *cast<Seq>(re)) {
43                collect(item);
44            }
45        } else if (isa<Alt>(re)) {
46            for (auto item : *cast<Alt>(re)) {
47                collect(item);
48            }
49        } else if (isa<Rep>(re)) {
50            collect(cast<Rep>(re)->getRE());
51        } else if (isa<Assertion>(re)) {
52            collect(cast<Assertion>(re)->getAsserted());
53        } else if (isa<Diff>(re)) {
54            collect(cast<Diff>(re)->getLH());
55            collect(cast<Diff>(re)->getRH());
56        } else if (isa<Intersect>(re)) {
57            collect(cast<Intersect>(re)->getLH());
58            collect(cast<Intersect>(re)->getRH());
59        }
60    }
61}
62
63std::vector<const CC *> collectUnicodeSets(RE * const re, std::set<Name *> external) {
64    SetCollector collector;
65    collector.ignoredExternals = external;
66    collector.collect(re);
67    return collector.UnicodeSets;
68}
69
70
71
72}
Note: See TracBrowser for help on using the repository browser.