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

Last change on this file since 4415 was 4406, checked in by cameron, 4 years ago

AST support for Lookahead/Lookbehind? assertions

File size: 2.3 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/re_intersect.h>
9#include <re/re_assertion.h>
10#include <re/printer_re.h>
11#include <iostream>
12
13using namespace re;
14
15namespace cc {
16
17RE * CC_NameMap::process(RE * re, const CC_type t) {
18    if (Alt * alt = dyn_cast<Alt>(re)) {
19        for (auto i = alt->begin(); i != alt->end(); ++i) {
20            *i = process(*i, t);
21        }
22    }
23    else if (Seq * seq = dyn_cast<Seq>(re)) {
24        for (auto i = seq->begin(); i != seq->end(); ++i) {
25            *i = process(*i, t);
26        }
27    }
28    else if (Rep * rep = dyn_cast<Rep>(re)) {
29        rep->setRE(process(rep->getRE(), t));
30    }
31    else if (Assertion * a = dyn_cast<Assertion>(re)) {
32        a->setAsserted(process(a->getAsserted(), t));
33    }
34    else if (Diff * diff = dyn_cast<Diff>(re)) {
35        diff->setRH(process(diff->getRH(), t));
36        diff->setLH(process(diff->getLH(), t));
37    }
38    else if (Intersect * e = dyn_cast<Intersect>(re)) {
39        e->setRH(process(e->getRH(), t));
40        e->setLH(process(e->getLH(), t));
41    }
42    else if (Name * nameNode = dyn_cast<Name>(re)) {
43        RE * def = nameNode->getDefinition();
44        if (def && !isa<CC>(def)) {
45            nameNode->setDefinition(process(def, t));
46        }
47        std::string classname = nameNode->getName();
48        auto f = mNameMap.find(classname);
49        if (f == mNameMap.end()) {
50            // Insert into the name map.
51            return insert(std::move(classname), nameNode);
52        }
53        return f->second;
54    }
55    else if (CC * cc = dyn_cast<CC>(re)) {
56        std::string classname = cc->canonicalName(t);
57        auto f = mNameMap.find(classname);
58        if (f == mNameMap.end()) {
59            Name * n;
60            if (t == ByteClass) {
61              n = makeByteName(classname, cc);
62            }
63            else {
64              n = makeName(classname, cc);
65            }
66            return insert(std::move(classname), n);
67        }
68        return f->second;
69    }
70    return re;
71}
72
73std::string CC_NameMap::printMap() {
74    std::string retval = "";
75    for (Name * name : mNameVector) {
76        retval.append("mNameMap[" +  name->getName() + "] = " + Printer_RE::PrintRE(name->getDefinition()) + "]\n");
77    }
78    return retval;
79}
80
81}
Note: See TracBrowser for help on using the repository browser.