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

Last change on this file since 5350 was 5308, checked in by cameron, 3 years ago

Boundary assertions; comment out a bug with RemoveNullableAfterAssertion?

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