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

Last change on this file was 5631, checked in by cameron, 2 weeks ago

Small fixes

File size: 2.4 KB
Line 
1#include "re_collect_unicodesets.h"
2#include <re/re_name.h>
3#include <re/re_any.h>
4#include <re/re_start.h>
5#include <re/re_end.h>
6#include <re/re_alt.h>
7#include <re/re_cc.h>
8#include <re/re_seq.h>
9#include <re/re_rep.h>
10#include <re/re_diff.h>
11#include <re/re_intersect.h>
12#include <re/re_assertion.h>
13#include <re/re_analysis.h>
14#include <re/re_memoizer.hpp>
15#include <UCD/ucd_compiler.hpp>
16#include <UCD/resolve_properties.h>
17#include <boost/container/flat_set.hpp>
18#include <cc/multiplex_CCs.h>
19#include <sstream>
20#include <iostream>
21
22using namespace boost::container;
23using namespace llvm;
24
25namespace re {
26   
27class SetCollector {
28public:
29    void collect_UnicodeSets(RE * re, std::vector<UCD::UnicodeSet> & UnicodeSets);
30private:
31    flat_set<Name *>        mVisited;
32};
33
34void SetCollector::collect_UnicodeSets(RE * re, std::vector<UCD::UnicodeSet> & UnicodeSets) {
35    assert ("RE object cannot be null!" && re);
36    if (CC * cc = dyn_cast<CC>(re)) {
37        UnicodeSets.push_back(* cast<UCD::UnicodeSet>(cc));
38    } else if (isa<Name>(re)) {
39        if (mVisited.insert(cast<Name>(re)).second) {
40            collect_UnicodeSets(cast<Name>(re)->getDefinition(), UnicodeSets);
41        }
42    } else if (isa<Seq>(re)) {
43        for (RE * item : *cast<Seq>(re)) {
44            collect_UnicodeSets(item, UnicodeSets);
45        }
46    } else if (isa<Alt>(re)) {
47        for (RE * item : *cast<Alt>(re)) {
48            collect_UnicodeSets(item, UnicodeSets);
49        }
50    } else if (isa<Rep>(re)) {
51        collect_UnicodeSets(cast<Rep>(re)->getRE(), UnicodeSets);
52    } else if (isa<Assertion>(re)) {
53        collect_UnicodeSets(cast<Assertion>(re)->getAsserted(), UnicodeSets);
54    } else if (isa<Diff>(re)) {
55        collect_UnicodeSets(cast<Diff>(re)->getLH(), UnicodeSets);
56        collect_UnicodeSets(cast<Diff>(re)->getRH(), UnicodeSets);
57    } else if (isa<Intersect>(re)) {
58        collect_UnicodeSets(cast<Intersect>(re)->getLH(), UnicodeSets);
59        collect_UnicodeSets(cast<Intersect>(re)->getRH(), UnicodeSets);
60    } else if (isa<Any>(re)) {
61        UnicodeSets.push_back(UCD::UnicodeSet(0x00, 0x10FFFF));
62    } else if (isa<Start>(re)) {
63        // LineBreak set handled globally
64    } else if (isa<End>(re)) {
65        // LineBreak set handled globally
66    }
67}
68   
69std::vector<UCD::UnicodeSet> collect_UnicodeSets(RE * re) {
70    SetCollector collector;
71    std::vector<UCD::UnicodeSet> UnicodeSets;
72    collector.collect_UnicodeSets(re, UnicodeSets);
73    return UnicodeSets;
74}
75
76}
Note: See TracBrowser for help on using the repository browser.