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

Last change on this file since 5371 was 5357, checked in by xuedongx, 3 years ago

delete the linebreak computation in icgrep

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