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

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

Next nodes for While statements must be declared similar to how Defined Vars are for Ifs. (Temporarily breaks multiplexing correctness.)

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