source: icGREP/icgrep-devel/icgrep/UCD/ucd_compiler.hpp @ 4841

Last change on this file since 4841 was 4841, checked in by nmedfort, 4 years ago

Update for grapheme cluster mode and boundaries.

File size: 3.2 KB
Line 
1#ifndef UCDCOMPILER_HPP
2#define UCDCOMPILER_HPP
3
4#include <re/re_cc.h>
5#include <vector>
6#ifdef USE_BOOST
7#include <boost/container/flat_map.hpp>
8#else
9#include <unordered_map>
10#endif
11
12namespace cc {
13    class CC_Compiler;
14}
15
16namespace re {
17    class Name;
18}
19
20namespace pablo {
21    class PabloBuilder;
22    class PabloAST;
23}
24
25namespace UCD {
26
27class UnicodeSet;
28
29class UCDCompiler {
30
31    using CC = re::CC;
32    using PabloBuilder = pablo::PabloBuilder;
33    using PabloAST = pablo::PabloAST;
34    using codepoint_t = re::codepoint_t;
35    using RangeList = std::vector<re::interval_t>;
36    #ifdef USE_BOOST
37    using TargetMap = boost::container::flat_map<const UnicodeSet *, PabloAST *>;
38    #else
39    using TargetMap = std::unordered_map<const UnicodeSet *, PabloAST *>;
40    #endif
41    using Target = std::pair<const UnicodeSet *, PabloAST *>;
42    using TargetVector = std::vector<Target>;
43
44    static const RangeList defaultIfHierachy;
45    static const RangeList noIfHierachy;
46
47public:
48
49    #ifdef USE_BOOST
50    using NameMap = boost::container::flat_map<re::Name *, PabloAST *>;
51    #else
52    using NameMap = std::unordered_map<re::Name *, PabloAST *>;
53    #endif
54
55    UCDCompiler(cc::CC_Compiler & ccCompiler);
56
57    void generateWithDefaultIfHierarchy(NameMap & names, PabloBuilder & entry);
58
59    void generateWithoutIfHierarchy(NameMap & names, PabloBuilder & entry);
60
61    PabloAST * generateWithDefaultIfHierarchy(const UnicodeSet * set, PabloBuilder & entry);
62
63    PabloAST * generateWithoutIfHierarchy(const UnicodeSet * set, PabloBuilder & entry);
64
65protected:
66
67    void generateRange(const RangeList & ifRanges, PabloBuilder & entry);
68
69    void generateRange(const RangeList & ifRanges, const codepoint_t lo, const codepoint_t hi, PabloBuilder & builder);
70
71    void generateSubRanges(const codepoint_t lo, const codepoint_t hi, PabloBuilder & builder);
72
73    PabloAST * sequenceGenerator(const RangeList && ranges, const unsigned byte_no, PabloBuilder & builder, PabloAST * target, PabloAST * prefix);
74
75    PabloAST * sequenceGenerator(const codepoint_t lo, const codepoint_t hi, const unsigned byte_no, PabloBuilder & builder, PabloAST * target, PabloAST * prefix);
76
77    PabloAST * ifTestCompiler(const codepoint_t lo, const codepoint_t hi, PabloBuilder & builder);
78
79    PabloAST * ifTestCompiler(const codepoint_t lo, const codepoint_t hi, const unsigned byte_no, PabloBuilder & builder, PabloAST * target);
80
81    PabloAST * makePrefix(const codepoint_t cp, const unsigned byte_no, PabloBuilder & builder, PabloAST * prefix);
82
83    static RangeList byteDefinitions(const RangeList & list, const unsigned byte_no);
84
85    template <typename RangeListOrUnicodeSet>
86    static RangeList rangeIntersect(const RangeListOrUnicodeSet & list, const codepoint_t lo, const codepoint_t hi);
87
88    static RangeList rangeGaps(const RangeList & list, const codepoint_t lo, const codepoint_t hi);
89
90    static RangeList outerRanges(const RangeList & list);
91
92    static RangeList innerRanges(const RangeList & list);
93
94    void addTargets(const NameMap & names);
95
96    void updateNames(NameMap & names, PabloBuilder & entry);
97
98private:
99    cc::CC_Compiler &       mCharacterClassCompiler;
100    PabloAST *              mSuffixVar;
101    TargetMap               mTargetMap;
102};
103
104}
105
106#endif // UCDCOMPILER_HPP
Note: See TracBrowser for help on using the repository browser.