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

Last change on this file was 5565, checked in by xuedongx, 4 months ago

Separate name resolve and gather for future use. Add re_colloect_unicodesets and re_multiplex.

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