aboutsummaryrefslogtreecommitdiffhomepage
path: root/include/PosRegExp.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/PosRegExp.h')
-rw-r--r--include/PosRegExp.h138
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 */