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

Last change on this file since 5792 was 5787, checked in by cameron, 17 months ago

RE parser restructuring; parsing symbolic ranges, collation and equivalence exprs

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