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

Last change on this file since 5781 was 5780, checked in by cameron, 18 months ago

Strip out local mode from RE compiler

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