source: icGREP/icgrep-devel/icgrep/re/collect_ccs.cpp @ 5934

Last change on this file since 5934 was 5934, checked in by cameron, 11 months ago

Multithreaded simple RE mode initial check-in

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