source: icGREP/icgrep-devel/icgrep/re/re_name_gather.cpp @ 5786

Last change on this file since 5786 was 5763, checked in by cameron, 18 months ago

Range RE objects

File size: 2.3 KB
Line 
1#include "re_name_gather.h"
2#include <re/re_name.h>
3#include <re/re_alt.h>
4#include <re/re_cc.h>
5#include <re/re_seq.h>
6#include <re/re_rep.h>
7#include <re/re_range.h>
8#include <re/re_diff.h>
9#include <re/re_intersect.h>
10#include <re/re_assertion.h>
11#include <re/re_analysis.h>
12#include <re/re_memoizer.hpp>
13#include <UCD/ucd_compiler.hpp>
14#include <UCD/resolve_properties.h>
15#include <boost/container/flat_set.hpp>
16#include <sstream>
17
18using NameMap = UCD::UCDCompiler::NameMap;
19
20using namespace boost::container;
21using namespace llvm;
22
23namespace re {
24
25struct NameGather {
26
27    void gather(RE * re) {
28        assert ("RE object cannot be null!" && re);
29        if (isa<Name>(re)) {
30            if (mVisited.insert(cast<Name>(re)).second) {
31                if (cast<Name>(re)->getType() == Name::Type::ZeroWidth) {
32                    mZeroWidth = cast<Name>(re);
33                }
34                if (isa<CC>(cast<Name>(re)->getDefinition())) {
35                    mNameMap.emplace(cast<Name>(re), nullptr);
36                } else {
37                    gather(cast<Name>(re)->getDefinition());
38                }
39            }
40        } else if (isa<Seq>(re)) {
41            for (RE * item : *cast<Seq>(re)) {
42                gather(item);
43            }
44        } else if (isa<Alt>(re)) {
45            for (RE * item : *cast<Alt>(re)) {
46                gather(item);
47            }
48        } else if (isa<Rep>(re)) {
49            gather(cast<Rep>(re)->getRE());
50        } else if (isa<Assertion>(re)) {
51            gather(cast<Assertion>(re)->getAsserted());
52        } else if (Range * rg = dyn_cast<Range>(re)) {
53            gather(rg->getLo());
54            gather(rg->getHi());
55        } else if (isa<Diff>(re)) {
56            gather(cast<Diff>(re)->getLH());
57            gather(cast<Diff>(re)->getRH());
58        } else if (isa<Intersect>(re)) {
59            gather(cast<Intersect>(re)->getLH());
60            gather(cast<Intersect>(re)->getRH());
61        }
62    }
63
64    NameGather(NameMap & nameMap, Name *& zeroWidth)
65    : mZeroWidth(zeroWidth)
66    , mNameMap(nameMap) {
67
68    }
69
70private:
71
72    Name *&                 mZeroWidth;
73    NameMap &               mNameMap;
74    flat_set<Name *>        mVisited;
75
76};
77   
78NameMap gatherNames(RE *& re, Name *& zeroWidth) {
79    NameMap nameMap;
80    NameGather nameGather(nameMap, zeroWidth);
81    nameGather.gather(re);
82    return nameMap;
83   
84}
85
86}
Note: See TracBrowser for help on using the repository browser.