source: icGREP/icgrep-devel/icgrep/re/re_compiler.h @ 5233

Last change on this file since 5233 was 5233, checked in by nmedfort, 3 years ago

Bug fixes for Carry Manager and issues reported by Fahad

File size: 5.6 KB
Line 
1/*
2 *  Copyright (c) 2014 International Characters.
3 *  This software is licensed to the public under the Open Software License 3.0.
4 *  icgrep is a trademark of International Characters.
5 */
6
7#ifndef RE_TO_PABLO_COMPILER_H
8#define RE_TO_PABLO_COMPILER_H
9
10#include <re/re_re.h>
11#include <re/re_seq.h>
12#include <cc/cc_compiler.h>
13#include <pablo/builder.hpp>
14#include <boost/container/flat_map.hpp>
15
16namespace UCD {
17class UnicodeSet;
18}
19
20/*   Marker streams represent the results of matching steps.
21     Three types of marker streams are used internally.
22     FinalMatchUnit markers are used for character classes and
23     other strings identified by a one bit at their final position.
24     InitialPostPositionUnit markers are used to mark matches with
25     a 1 bit immediately after a match.   InitialPostPositionUnit markers
26     are generally required whenever a regular expression element
27     can match the empty string (e.g., * and ? repeated items).
28     FinalPostPositionUnit markers are used for single code unit
29     lookahead assertions. 
30*/
31
32namespace re {
33
34enum MarkerPosition {FinalMatchUnit, FinalPostPositionUnit};
35
36struct MarkerType { 
37    MarkerPosition pos;
38    pablo::PabloAST * stream;
39    MarkerType & operator =(const MarkerType &) = default;
40};
41
42inline MarkerPosition markerPos(const MarkerType & m) {return m.pos; }
43
44inline pablo::PabloAST * markerVar(const MarkerType & m) {return m.stream; }
45
46inline MarkerType makeMarker(MarkerPosition newpos, pablo::PabloAST * strm) {return {newpos, strm};}
47
48
49class RE_Compiler {
50public:
51
52    RE_Compiler(pablo::PabloKernel * kernel, cc::CC_Compiler & ccCompiler, bool CountOnly = false);
53    void initializeRequiredStreams(const unsigned encodingBits);
54    void compileUnicodeNames(RE *& re);
55    void finalizeMatchResult(MarkerType match_result, bool InvertMatches = false);
56    MarkerType compile(RE * re) {
57        return compile(re, mPB);
58    }
59
60private:
61
62    struct NameMap {
63        NameMap(NameMap * parent = nullptr) : mParent(parent), mMap() {}
64        bool get(const Name * name, MarkerType & marker) const {
65            auto f = mMap.find(name);
66            if (f == mMap.end()) {
67                return mParent ? mParent->get(name, marker) : false;
68            } else {
69                marker = f->second;
70                return true;
71            }
72        }
73        void add(const Name * const name, MarkerType marker) {
74            mMap.emplace(name, std::move(marker));
75        }
76        NameMap * getParent() const { return mParent; }
77    private:
78        NameMap * const mParent;
79        boost::container::flat_map<const Name *, MarkerType> mMap;
80    };
81
82    void initializeRequiredStreams_utf8();
83    void initializeRequiredStreams_utf16();
84    MarkerType compile(RE * re, pablo::PabloBuilder & cg);
85
86    MarkerType process(RE * re, MarkerType marker, pablo::PabloBuilder & pb);
87    MarkerType compileName(Name * name, MarkerType marker, pablo::PabloBuilder & pb);
88    MarkerType compileSeq(Seq * seq, MarkerType marker, pablo::PabloBuilder & pb);
89    MarkerType compileSeqTail(Seq::iterator current, const Seq::iterator end, int matchLenSoFar, MarkerType marker, pablo::PabloBuilder & pb);
90    MarkerType compileAlt(Alt * alt, MarkerType marker, pablo::PabloBuilder & pb);
91    MarkerType compileAssertion(Assertion * a, MarkerType marker, pablo::PabloBuilder & pb);
92    MarkerType compileRep(Rep * rep, MarkerType marker, pablo::PabloBuilder & pb);
93    MarkerType compileDiff(Diff * diff, MarkerType marker, pablo::PabloBuilder & cg);
94    MarkerType compileIntersect(Intersect * x, MarkerType marker, pablo::PabloBuilder & cg);
95    pablo::PabloAST * consecutive_matches(pablo::PabloAST * repeated,  int length, int repeat_count, pablo::PabloBuilder & pb);
96    pablo::PabloAST * reachable(pablo::PabloAST * repeated,  int length, int repeat_count, pablo::PabloBuilder & pb);
97    static bool isFixedLength(RE * regexp);
98    MarkerType processLowerBound(RE * repeated,  int lb, MarkerType marker, pablo::PabloBuilder & pb);
99    MarkerType processUnboundedRep(RE * repeated, MarkerType marker, pablo::PabloBuilder & pb);
100    MarkerType processBoundedRep(RE * repeated, int ub, MarkerType marker, pablo::PabloBuilder & pb);
101    RE * resolveUnicodeProperties(RE * re);
102
103    MarkerType compileName(Name * name, pablo::PabloBuilder & pb);
104    MarkerType compileAny(const MarkerType m, pablo::PabloBuilder & pb);
105    MarkerType compileStart(const MarkerType marker, pablo::PabloBuilder & pb);
106    MarkerType compileEnd(const MarkerType marker, pablo::PabloBuilder & pb);
107
108    MarkerType AdvanceMarker(MarkerType marker, const MarkerPosition newpos, pablo::PabloBuilder & pb);
109    void AlignMarkers(MarkerType & m1, MarkerType & m2, pablo::PabloBuilder & pb);
110
111private:
112
113    pablo::PabloKernel * const                      mKernel;
114    bool                                            mCountOnly;
115    cc::CC_Compiler &                               mCCCompiler;
116    pablo::PabloAST *                               mLineBreak;
117    pablo::PabloAST *                               mCRLF;
118    pablo::PabloAST *                               mAny;
119    pablo::PabloAST *                               mGraphemeBoundaryRule;
120    pablo::PabloAST *                               mInitial;
121    pablo::PabloAST *                               mNonFinal;
122    pablo::PabloAST *                               mFinal;
123    pablo::PabloAST *                               mWhileTest;
124    int                                             mStarDepth;
125    pablo::PabloBuilder &                           mPB;
126    NameMap *                                       mCompiledName;
127    NameMap                                         mBaseMap;
128};
129
130}
131
132#endif // COMPILER_H
Note: See TracBrowser for help on using the repository browser.