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

Last change on this file since 5063 was 5045, checked in by xuedongx, 3 years ago

Support over UTF-16 representation of Unicode

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