Ignore:
Timestamp:
Mar 30, 2018, 10:36:24 AM (14 months ago)
Author:
cameron
Message:

Direct CC builder work

File:
1 edited

Legend:

Unmodified
Added
Removed
  • icGREP/icgrep-devel/icgrep/re/collect_ccs.cpp

    r5934 r5935  
    1212#include <re/re_assertion.h>
    1313#include <cc/alphabet.h>
     14#include <re/re_memoizer.hpp>
     15
    1416#include <boost/container/flat_set.hpp>
    1517#include <llvm/Support/raw_ostream.h>
     
    1921namespace re {
    2022   
    21 struct SetCollector {
     23struct SetCollector : private Memoizer {
    2224    void collect(RE * const re);
    2325public:
    2426    const cc::Alphabet * alphabet;
    2527    std::vector<CC *> theSets;
    26     boost::container::flat_set<const RE *>  Visited;
    2728    std::set<Name *> ignoredExternals;
    2829};
     
    3031void SetCollector::collect(RE * const re) {
    3132    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);
     33    if (CC * cc = dyn_cast<CC>(re)) {
     34        if (cc->getAlphabet() == alphabet) {
     35            if (find(cc) == end()) {
     36                cc = memoize(cc);
     37                theSets.push_back(cc);
    3738            }
    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());
    6139        }
     40    } else if (isa<Name>(re)) {
     41        if (ignoredExternals.find(cast<Name>(re)) != ignoredExternals.end()) return;
     42        auto def = cast<Name>(re)->getDefinition();
     43        if (def != nullptr)
     44            collect(def);
     45    } else if (isa<Seq>(re)) {
     46        for (auto item : *cast<Seq>(re)) {
     47            collect(item);
     48        }
     49    } else if (isa<Alt>(re)) {
     50        for (auto item : *cast<Alt>(re)) {
     51            collect(item);
     52        }
     53    } else if (isa<Rep>(re)) {
     54        collect(cast<Rep>(re)->getRE());
     55    } else if (isa<Assertion>(re)) {
     56        collect(cast<Assertion>(re)->getAsserted());
     57    } else if (isa<Diff>(re)) {
     58        collect(cast<Diff>(re)->getLH());
     59        collect(cast<Diff>(re)->getRH());
     60    } else if (isa<Intersect>(re)) {
     61        collect(cast<Intersect>(re)->getLH());
     62        collect(cast<Intersect>(re)->getRH());
    6263    }
    6364}
Note: See TracChangeset for help on using the changeset viewer.