source: icGREP/icgrep-devel/icgrep/cc/cc_namemap.cpp @ 4255

Last change on this file since 4255 was 4255, checked in by nmedfort, 5 years ago

Added Diff to RE Compiler/Parser?. Removed CC.negate()

File size: 1.8 KB
Line 
1#include <cc/cc_namemap.hpp>
2#include <re/re_name.h>
3#include <re/re_cc.h>
4#include <re/re_alt.h>
5#include <re/re_seq.h>
6#include <re/re_rep.h>
7#include <re/re_diff.h>
8#include <re/printer_re.h>
9#include <iostream>
10
11using namespace re;
12
13namespace cc {
14
15void CC_NameMap::addPredefined(const std::string friendlyName, re::CC * cc) {
16    assert (cc);
17    std::string classname = cc->getName();
18    Name * name = makeName(classname, cc);
19    assert (name->getCC() == cc);
20    mNameMap.insert(std::make_pair(friendlyName, name));   
21    insert(std::move(classname), name);
22    assert (name->getCC() == cc);
23}
24
25RE * CC_NameMap::process(RE * re) {
26    if (Alt * alt = dyn_cast<Alt>(re)) {
27        for (auto i = alt->begin(); i != alt->end(); ++i) {
28            *i = process(*i);
29        }
30    }
31    else if (Seq * seq = dyn_cast<Seq>(re)) {
32        for (auto i = seq->begin(); i != seq->end(); ++i) {
33            *i = process(*i);
34        }
35    }
36    else if (Rep * rep = dyn_cast<Rep>(re)) {
37        rep->setRE(process(rep->getRE()));
38    }
39    else if (Diff * diff = dyn_cast<Diff>(re)) {
40        diff->setRH(process(diff->getRH()));
41        diff->setLH(process(diff->getLH()));
42    }
43    else if (Name * name = dyn_cast<Name>(re)) {
44        RE * cc = name->getCC();
45        if (cc && !isa<CC>(cc)) {
46            name->setCC(process(cc));
47        }
48        std::string classname = name->getName();
49        auto f = mNameMap.find(classname);
50        if (f == mNameMap.end()) {
51            return insert(std::move(classname), name);
52        }
53        return f->second;
54    }
55    else if (CC * cc = dyn_cast<CC>(re)) {
56        std::string classname = cc->getName();
57        auto f = mNameMap.find(classname);
58        if (f == mNameMap.end()) {
59            return insert(std::move(classname), makeName(classname, cc));
60        }
61        return f->second;
62    }
63    return re;
64}
65
66}
Note: See TracBrowser for help on using the repository browser.