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

Last change on this file since 4808 was 4808, checked in by nmedfort, 4 years ago

Progress on multi-target UCD compilation

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