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

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

Rewrite of the CarryManager? to support non-carry-collapsing loops.

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