00001 #include "LabelDict.hpp" 00002 #include "MemStreamer.hpp" 00003 00004 class FSMState; 00005 class FSM; 00006 00007 extern MemStreamer *vregexprmem; // Identifiers the global memory 00008 // that is used to storing all regular expressions 00009 // In the current version, this is simply 'tmpmem' 00010 00011 //************************************************************************************* 00012 //************************************************************************************* 00013 00014 #define VP_ITEMTYPE_LABEL 0 00015 #define VP_ITEMTYPE_DONTCARE 1 00016 #define VP_ITEMTYPE_POUND 12 00017 #define VP_ITEMTYPE_STAR 2 00018 #define VP_ITEMTYPE_PLUS 3 00019 #define VP_ITEMTYPE_OPT 4 00020 #define VP_ITEMTYPE_NOT 5 00021 #define VP_ITEMTYPE_EMPTY 6 00022 #define VP_ITEMTYPE_GROUP 7 00023 00024 #define VP_ITEMTYPE_MINUS 8 00025 #define VP_ITEMTYPE_SEQ 9 00026 #define VP_ITEMTYPE_ALT 10 00027 #define VP_ITEMTYPE_AND 11 00028 00029 00030 #define MAX_LEN ((unsigned short)65535) 00031 00032 class VRegExpr 00033 { 00034 unsigned type:5; // The type of regular expression 00035 00036 union{ 00037 TLabelID labelid; // The regular expression could be a label 00038 struct // Or a pair of two children 00039 { 00040 VRegExpr *child1; 00041 VRegExpr *child2; 00042 } children; 00043 }; 00044 00045 void CreateFSMEdges(FSM *fsm,FSMState *fromstate,FSMState *tostate); 00046 00047 public: 00048 void *operator new(size_t size) { return vregexprmem->GetByteBlock(size); } 00049 void operator delete(void *ptr) {} 00050 00051 VRegExpr(TLabelID mylabelid) 00052 { 00053 type=VP_ITEMTYPE_LABEL; 00054 labelid=mylabelid; 00055 } 00056 00057 VRegExpr(int mytype,VRegExpr *child1=NULL,VRegExpr *child2=NULL) 00058 { 00059 type=mytype; 00060 children.child1=child1; 00061 children.child2=child2; 00062 } 00063 00064 void PrintLabelList(); 00065 void Print(); 00066 00067 FSM *CreateNonDetFSM(); 00068 FSM *CreateFSM(); 00069 00070 static TLabelID ParseLabel(char **str,char *endptr); 00071 static VRegExpr *ParseVRegExpr(char * &str,char *endptr); 00072 }; 00073 00074 //************************************************************************************ 00075 //************************************************************************************