diff options
Diffstat (limited to 'include/PosRegExp.h')
-rw-r--r-- | include/PosRegExp.h | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/include/PosRegExp.h b/include/PosRegExp.h new file mode 100644 index 000000000..b915b1ed4 --- /dev/null +++ b/include/PosRegExp.h @@ -0,0 +1,138 @@ +#ifndef POSREGEXP_H +#define POSREGEXP_H + +#define MatchesNum 0x10 + +enum EOps +{ + ReBlockOps = 0x1000, + ReMul, // * + RePlus, // + + ReQuest, // ? + ReNGMul, // *? + ReNGPlus, // +? + ReNGQuest, // ?? + ReRangeN, // {n,} + ReRangeNM, // {n,m} + ReNGRangeN, // {n,}? + ReNGRangeNM, // {n,m}? + ReOr, // | + ReBehind = 0x1100, // ?#n + ReNBehind = 0x1200, // ?~n + ReAhead = 0x1300, // ?= + ReNAhead = 0x1400, // ?! + + ReSymbolOps = 0x2000, + ReEmpty, + ReSymb, // a b \W \s ... + ReEnum, // [] + ReNEnum, // [^] + ReBrackets, // (...) + ReBkTrace = 0x2100, // \yN + ReBkBrack = 0x2200 // \N +}; + +enum ESymbols +{ + ReAnyChr = 0x4000, // . + ReSoL, // ^ + ReEoL, // $ + ReDigit, // \d + ReNDigit, // \D + ReWordSymb, // \w + ReNWordSymb, // \W + ReWSpace, // \s + ReNWSpace, // \S + ReUCase, // \u + ReNUCase , // \l + ReWBound, // \b + ReNWBound, // \B + RePreNW, // \c + ReStart, // \m + ReEnd, // \M + + ReChr = 0x0 // Char in Lower Byte +}; +enum ETempSymb +{ + ReTemp = 0x7000, + ReLBrack, ReRBrack, + ReEnumS, ReEnumE, ReNEnumS, + ReRangeS, ReRangeE, ReNGRangeE, ReFrToEnum +}; + +#define BackSlash '\\' + +typedef union SCharData +{ + int IArr[8]; + char CArr[32]; + void SetBit(unsigned char Bit); + void ClearBit(unsigned char Bit); + bool GetBit(unsigned char Bit); +} *PCharData; + +typedef struct SRegInfo +{ + SRegInfo(); + ~SRegInfo(); + + EOps Op; + union{ + SRegInfo *Param; + int Symb; + PCharData ChrClass; + }un; + int s,e; + SRegInfo *Parent; + SRegInfo *Next; +} *PRegInfo; + +typedef struct SMatches +{ + int s[MatchesNum]; + int e[MatchesNum]; + int CurMatch; +} *PMatches; + +typedef class PosRegExp +{ + PRegInfo Info; + PMatches BkTrace; + bool NoCase,Extend,NoMoves; + bool Error; + int *Exprn; + int posParse; + int posEnd,posStart; + int posBkStr; + int FirstChar; + + bool SetExprLow(const char *Expr); + bool SetStructs(PRegInfo &Info,int st,int end); + void Optimize(); + bool CheckSymb(int Symb,bool Inc); + bool LowParse(PRegInfo Re); + bool LowParseRe(PRegInfo &Next); + bool LowCheckNext(PRegInfo Re); + bool ParseRe(int posStr); + bool QuickCheck(); +public: + PMatches Matches; + int Ok, CurMatch; + + void *param; + char (*CharAt)(int pos, void *param); + + PosRegExp(); + ~PosRegExp(); + + bool isok(); + bool SetNoMoves(bool Moves); + bool SetBkTrace(int posStr,PMatches Trace); + bool SetExpr(const char *Expr); + bool Parse(int posStr, int posStop, PMatches Mtch); + bool Parse(int posStr,int posSol, int posEol, PMatches Mtch, int Moves = -1); + bool Evaluate(char *Expr, int posStr, PMatches Mtch, char **Res); +} *PPosRegExp; + +#endif /* POSREGEXP_H */ |