📄 regularexpression.hpp
字号:
XMLCh* fPattern; XMLCh* fFixedString; Op* fOperations; Token* fTokenTree; RangeToken* fFirstChar; static RangeToken* fWordRange; OpFactory fOpFactory; XMLMutex fMutex; TokenFactory* fTokenFactory; MemoryManager* fMemoryManager;}; // --------------------------------------------------------------------------- // RegularExpression: Cleanup methods // --------------------------------------------------------------------------- inline void RegularExpression::cleanUp() { fMemoryManager->deallocate(fPattern);//delete [] fPattern; fMemoryManager->deallocate(fFixedString);//delete [] fFixedString; delete fBMPattern; delete fTokenFactory; } // --------------------------------------------------------------------------- // RegularExpression: Helper methods // --------------------------------------------------------------------------- inline bool RegularExpression::isSet(const int options, const int flag) { return (options & flag) == flag; } inline Op* RegularExpression::compileLook(const Token* const token, const Op* const next, const bool reverse, const unsigned short tokType) { Op* ret = 0; Op* result = compile(token->getChild(0), 0, reverse); switch(tokType) { case Token::T_LOOKAHEAD: ret = fOpFactory.createLookOp(Op::O_LOOKAHEAD, next, result); break; case Token::T_NEGATIVELOOKAHEAD: ret = fOpFactory.createLookOp(Op::O_NEGATIVELOOKAHEAD, next, result); break; case Token::T_LOOKBEHIND: ret = fOpFactory.createLookOp(Op::O_LOOKBEHIND, next, result); break; case Token::T_NEGATIVELOOKBEHIND: ret = fOpFactory.createLookOp(Op::O_NEGATIVELOOKBEHIND, next, result); break; case Token::T_INDEPENDENT: ret = fOpFactory.createIndependentOp(next, result); break; case Token::T_MODIFIERGROUP: ret = fOpFactory.createModifierOp(next, result, ((ModifierToken *) token)->getOptions(), ((ModifierToken *) token)->getOptionsMask()); break; } return ret; } inline Op* RegularExpression::compileSingle(const Token* const token, Op* const next, const unsigned short tokType) { Op* ret = 0; switch (tokType) { case Token::T_DOT: ret = fOpFactory.createDotOp(); break; case Token::T_CHAR: ret = fOpFactory.createCharOp(token->getChar()); break; case Token::T_ANCHOR: ret = fOpFactory.createAnchorOp(token->getChar()); break; case Token::T_RANGE: case Token::T_NRANGE: ret = fOpFactory.createRangeOp(token); break; case Token::T_EMPTY: ret = next; break; case Token::T_STRING: ret = fOpFactory.createStringOp(token->getString()); break; case Token::T_BACKREFERENCE: ret = fOpFactory.createBackReferenceOp(token->getReferenceNo()); break; } if (tokType != Token::T_EMPTY) ret->setNextOp(next); return ret; } inline Op* RegularExpression::compileUnion(const Token* const token, Op* const next, const bool reverse) { int tokSize = token->size(); UnionOp* uniOp = fOpFactory.createUnionOp(tokSize); for (int i=0; i<tokSize; i++) { uniOp->addElement(compile(token->getChild(i), next, reverse)); } return uniOp; } inline Op* RegularExpression::compileCondition(const Token* const token, Op* const next, const bool reverse) { Token* condTok = ((ConditionToken*) token)->getConditionToken(); Token* yesTok = token->getChild(0); Token* noTok = token->getChild(1); int refNo = token->getReferenceNo(); Op* condOp = (condTok == 0) ? 0 : compile(condTok, 0, reverse); Op* yesOp = compile(yesTok, next, reverse); Op* noOp = (noTok == 0) ? 0 : compile(noTok, next, reverse); return fOpFactory.createConditionOp(next, refNo, condOp, yesOp, noOp); } inline Op* RegularExpression::compileParenthesis(const Token* const token, Op* const next, const bool reverse) { if (token->getNoParen() == 0) return compile(token->getChild(0), next, reverse); Op* captureOp = 0; if (reverse) { captureOp = fOpFactory.createCaptureOp(token->getNoParen(), next); captureOp = compile(token->getChild(0), captureOp, reverse); return fOpFactory.createCaptureOp(-token->getNoParen(), captureOp); } captureOp = fOpFactory.createCaptureOp(-token->getNoParen(), next); captureOp = compile(token->getChild(0), captureOp, reverse); return fOpFactory.createCaptureOp(token->getNoParen(), captureOp); } inline Op* RegularExpression::compileConcat(const Token* const token, Op* const next, const bool reverse) { Op* ret = next; int tokSize = token->size(); if (!reverse) { for (int i= tokSize - 1; i>=0; i--) { ret = compile(token->getChild(i), ret, false); } } else { for (int i= 0; i< tokSize; i++) { ret = compile(token->getChild(i), ret, true); } } return ret; } inline Op* RegularExpression::compileClosure(const Token* const token, Op* const next, const bool reverse, const unsigned short tokType) { Op* ret = 0; Token* childTok = token->getChild(0); int min = token->getMin(); int max = token->getMax(); if (min >= 0 && min == max) { ret = next; for (int i=0; i< min; i++) { ret = compile(childTok, ret, reverse); } return ret; } if (min > 0 && max > 0) max -= min; if (max > 0) { ret = next; for (int i=0; i<max; i++) { ChildOp* childOp = fOpFactory.createQuestionOp( tokType == Token::T_NONGREEDYCLOSURE); childOp->setNextOp(next); childOp->setChild(compile(childTok, ret, reverse)); ret = childOp; } } else { ChildOp* childOp = 0; if (tokType == Token::T_NONGREEDYCLOSURE) { childOp = fOpFactory.createNonGreedyClosureOp(); } else { if (childTok->getMinLength() == 0) childOp = fOpFactory.createClosureOp(fNoClosures++); else childOp = fOpFactory.createClosureOp(-1); } childOp->setNextOp(next); childOp->setChild(compile(childTok, childOp, reverse)); ret = childOp; } if (min > 0) { for (int i=0; i< min; i++) { ret = compile(childTok, ret, reverse); } } return ret; } inline int RegularExpression::matchUnion(Context* const context, const Op* const op, int offset, const short direction) { unsigned int opSize = op->getSize(); int ret = -1; for (unsigned int i=0; i < opSize; i++) { ret = match(context, op->elementAt(i), offset, direction); if (ret == context->fLimit) return ret; } return -1; } inline int RegularExpression::matchModifier(Context* const context, const Op* const op, int offset, const short direction) { int saveOptions = fOptions; fOptions |= (int) op->getData(); fOptions &= (int) ~op->getData2(); int ret = match(context, op->getChild(), offset, direction); fOptions = saveOptions; return ret; } inline unsigned short RegularExpression::getWordType(const XMLCh* const target , const int begin , const int end , const int offset) { if (offset < begin || offset >= end) return WT_OTHER; return getCharType(target[offset]); } inline unsigned short RegularExpression::getPreviousWordType(const XMLCh* const target , const int start , const int end , int offset) { unsigned short ret = getWordType(target, start, end, --offset); while (ret == WT_IGNORE) { ret = getWordType(target, start, end, --offset); } return ret; } inline bool RegularExpression::matchIgnoreCase(const XMLInt32 ch1, const XMLInt32 ch2){ return (0==XMLString::compareNIString((XMLCh*)&ch1,(XMLCh*)&ch2, 1));}XERCES_CPP_NAMESPACE_END#endif/** * End of file RegularExpression.hpp */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -