From 4310cdbe84b6a3fbfb964c5b94e728a9876cf28f Mon Sep 17 00:00:00 2001 From: Edouard DUPIN Date: Thu, 24 Jul 2014 22:01:46 +0200 Subject: [PATCH] [DEV] rework cyclic element --- etk/RegExp.h | 108 +++++++++++++++++++++++++++++++++----------------- test/main.cpp | 9 ++++- 2 files changed, 79 insertions(+), 38 deletions(-) diff --git a/etk/RegExp.h b/etk/RegExp.h index 55b8310..32e652b 100644 --- a/etk/RegExp.h +++ b/etk/RegExp.h @@ -159,8 +159,9 @@ class FindProperty { int64_t m_positionStart; //!< find start position int64_t m_positionStop; //!< find end position uint32_t m_multiplicity; //!< curent multiplicity of find element - std::vector m_subProperty; //!< list of all sub elements enum parseStatus m_status; //!< curent status of parsing + public: + std::vector m_subProperty; //!< list of all sub elements public: FindProperty() : m_positionStart(-1), @@ -209,20 +210,20 @@ class FindProperty { void display(const std::string& _data, int32_t _level = 0) { TK_INFO("prop : " << levelSpace(_level) << " [" << m_positionStart << "," - << m_positionStop << "] mul=" + << m_positionStop << "]*" << m_multiplicity << " data='" << std::string(_data, m_positionStart, m_positionStop-m_positionStart) << "'"); for (auto &it : m_subProperty) { - it.display(_data, _level++); + it.display(_data, _level+1); } } void display(int32_t _level = 0) { TK_INFO("prop : " << levelSpace(_level) << " [" << m_positionStart << "," - << m_positionStop << "] mul=" + << m_positionStop << "]*" << m_multiplicity); for (auto &it : m_subProperty) { - it.display(_level++); + it.display(_level+1); } } }; @@ -966,8 +967,53 @@ template class NodePTheseElem : public Node { return _data.size(); }; private: - void parseInternal(const CLASS_TYPE& _data, int64_t _currentPos, int64_t _lenMax, FindProperty& _property, size_t _startListIndex) { - + bool parseInternal(const CLASS_TYPE& _data, int64_t _currentPos, int64_t _lenMax, FindProperty& _property, size_t _startListIndex) { + std::vector subProperty; + int findLen = 0; + bool error = false; + bool findPartialNode = false; + do { + findPartialNode = false; + int64_t tmpCurrentPos = _currentPos; + for (size_t iii=_startListIndex+subProperty.size(); iiiparse(_data, tmpCurrentPos, _lenMax, prop); + offset = prop.getFindLen(); + tmpCurrentPos = prop.getPositionStop(); + subProperty.push_back(prop); + if (prop.getStatus() == parseStatusNone) { + error = true; + break; + } else { + TK_REG_EXP_DBG_MODE("Parse " << levelSpace(Node::m_nodeLevel) << " (Elem=" << iii << "/" << m_subNode.size() << ") 2 find : " << prop); + } + } + if (error == false) { + //_property.m_subProperty.push_back(prop); + for (auto &it: subProperty) { + _property.m_subProperty.push_back(it); + } + _property.setPositionStop(tmpCurrentPos); + _property.setStatus(parseStatusFull); + TK_REG_EXP_DBG_MODE("Parse " << levelSpace(Node::m_nodeLevel) << " (Elem=" << "/" << m_subNode.size() << ") 2 return : " << _property); + return true; + } + // Display sub List : + for (auto &it : subProperty) { + TK_REG_EXP_DBG_MODE(" plop : " << it); + } + for (int64_t iii=subProperty.size()-1; iii>=0; --iii) { + if (subProperty[iii].getStatus() == parseStatusPartial) { + findPartialNode = true; + subProperty.erase(subProperty.begin()+iii, subProperty.end()); + break; + } + } + } while (findPartialNode == true); + TK_REG_EXP_DBG_MODE("Parse " << levelSpace(Node::m_nodeLevel) << " (Elem=" << "/" << m_subNode.size() << ") 2 second parse ... (done)"); + return false; } public: virtual void parse(const CLASS_TYPE& _data, int64_t _currentPos, int64_t _lenMax, FindProperty& _property) { @@ -990,41 +1036,30 @@ template class NodePTheseElem : public Node { tmpCurrentPos = prop.getPositionStop(); if ( prop.getStatus() == parseStatusPartial && iii+1::m_nodeLevel+1) << " (Elem) 2 second parse ..."); - int64_t tmpCurrentPos2 = tmpCurrentPos; - int findLen2 = 0; - bool error = false; - for (size_t jjj=iii+1; jjjparse(_data, tmpCurrentPos2, _lenMax, prop2); - offset2 = prop2.getFindLen(); - tmpCurrentPos2 = prop2.getPositionStop(); - } while (prop2.getStatus() == parseStatusPartial); - if (prop2.getStatus() == parseStatusNone) { - error = true; - break; - } else { - TK_REG_EXP_DBG_MODE("Parse " << levelSpace(Node::m_nodeLevel) << " (Elem) 2 find : " << prop2); - } + TK_REG_EXP_DBG_MODE("Parse " << levelSpace(Node::m_nodeLevel+1) << " (Elem=" << iii << "/" << m_subNode.size() << ") 2 second parse ..."); + FindProperty prop2; + if (parseInternal(_data, tmpCurrentPos, _lenMax, prop2, iii) == true) { + _property.m_subProperty.push_back(prop); + /* + for (auto &it: subProperty) { + _property.m_subProperty.push_back(it); } - if (error == false) { - _property.setPositionStop(tmpCurrentPos2); - _property.setStatus(parseStatusFull); - TK_REG_EXP_DBG_MODE("Parse " << levelSpace(Node::m_nodeLevel) << " (Elem) 2 return : " << _property); - return; - } - TK_REG_EXP_DBG_MODE("Parse " << levelSpace(Node::m_nodeLevel) << " (Elem) 2 second parse ... (done)"); + */ + _property.setPositionStop(tmpCurrentPos); + _property.setStatus(parseStatusFull); + TK_REG_EXP_DBG_MODE("Parse " << levelSpace(Node::m_nodeLevel) << " (Elem=" << iii << "/" << m_subNode.size() << ") 2 return : " << _property); + return; + } + TK_REG_EXP_DBG_MODE("Parse " << levelSpace(Node::m_nodeLevel) << " (Elem=" << iii << "/" << m_subNode.size() << ") 2 second parse ... (done)"); } } while (prop.getStatus() == parseStatusPartial); + _property.m_subProperty.push_back(prop); if (prop.getStatus() == parseStatusNone) { findLen = 0; _property.setStatus(parseStatusNone); return; } else { - TK_REG_EXP_DBG_MODE("Parse " << levelSpace(Node::m_nodeLevel) << " (Elem) find : " << prop); + TK_REG_EXP_DBG_MODE("Parse " << levelSpace(Node::m_nodeLevel) << " (Elem=" << iii << "/" << m_subNode.size() << ") find : " << prop); } } if (tmpCurrentPos<_currentPos) { @@ -1142,6 +1177,7 @@ template class NodePThese : public Node { } while (prop.getStatus() == parseStatusPartial); if (prop.getStatus() == parseStatusFull) { findLen += prop.getFindLen(); + _property.m_subProperty.push_back(prop); tmpFind = true; } else if (prop.getStatus() == parseStatusPartial) { @@ -1559,11 +1595,11 @@ template class RegExp { } } } - m_exprRootNode.setPositionStart(_startPos); regexp::FindProperty prop; + prop.setPositionStart(_startPos); m_exprRootNode.parse(_SearchIn, _startPos, maxlen, prop); if (prop.getStatus() == regexp::parseStatusFull) { - findLen = m_exprRootNode.getFindLen(); + findLen = prop.getFindLen(); if ( _escapeChar != 0 && _startPos>0) { if (_escapeChar == (char32_t)_SearchIn[_startPos-1]) { diff --git a/test/main.cpp b/test/main.cpp index c6ac175..7ff711b 100644 --- a/test/main.cpp +++ b/test/main.cpp @@ -198,13 +198,18 @@ void testRegExpSingle(const std::string& _expression, const std::string& _search } void testRegExp() { - std::string data = " a /* plop */ \n int eee = 22; // error value \nint main(void) {\n return 0;\n}\n"; + //std::string data = " a /* plop */ \n int eee = 22; // error value \nint main(void) {\n return 0;\n}\n"; //std::string data = "alpha /* plop */ test"; //std::string data = "pp \n // qdfqdfsdf \nde"; - testRegExpSingle("/\\*.*\\*/", data); + //testRegExpSingle("/\\*.*\\*/", data); //testRegExpSingle("//.*$", data); //testRegExpSingle("/\\*.*", data); //testRegExpSingle("[a-z]", data); + //std::string data = " eesd a lzzml plophzzzzzhhhhhrlkmlkml"; + //testRegExpSingle("a.*plop(z{2,3}|h+)+r", data); + + std::string data = "pp \n# plop // qdfqdfsdf \nde"; + testRegExpSingle("#(\\\\\\\\|\\\\\\n|.)*$", data); } int main(int argc, const char *argv[]) {