[DEBUG] add m_xxx parsing

This commit is contained in:
Edouard DUPIN 2014-07-31 22:04:19 +02:00
parent 89784df428
commit a0bc4f8cc0
2 changed files with 63 additions and 51 deletions

View File

@ -16,10 +16,12 @@
#include <vector> #include <vector>
#include <memory> #include <memory>
#define TK_REG_EXP_DBG_MODE2 TK_HIDDEN
//#define TK_REG_EXP_DBG_MODE TK_HIDDEN //#define TK_REG_EXP_DBG_MODE TK_HIDDEN
#define TK_REG_EXP_DBG_MODE TK_VERBOSE //#define TK_REG_EXP_DBG_MODE TK_VERBOSE
//#define TK_REG_EXP_DBG_MODE TK_DEBUG #define TK_REG_EXP_DBG_MODE TK_DEBUG
#define TK_REG_EXP_DBG_MODE2 TK_HIDDEN
//#define TK_REG_EXP_DBG_MODE2 TK_VERBOSE
//regular colors //regular colors
#define ETK_BASH_COLOR_BLACK "\e[0;30m" #define ETK_BASH_COLOR_BLACK "\e[0;30m"
@ -1039,6 +1041,7 @@ template<class CLASS_TYPE> class NodePTheseElem : public Node<CLASS_TYPE> {
tmpCurrentPos = prop.getPositionStop(); tmpCurrentPos = prop.getPositionStop();
_property.m_subProperty.erase(_property.m_subProperty.begin()+jjj, _property.m_subProperty.end()); _property.m_subProperty.erase(_property.m_subProperty.begin()+jjj, _property.m_subProperty.end());
iii = jjj; iii = jjj;
TK_REG_EXP_DBG_MODE("Parse " << levelSpace(Node<CLASS_TYPE>::m_nodeLevel) << " (elem) rewind=" << iii);
break; break;
} }
} }
@ -1046,9 +1049,11 @@ template<class CLASS_TYPE> class NodePTheseElem : public Node<CLASS_TYPE> {
if (findPartialNode == false) { if (findPartialNode == false) {
_property.m_subProperty.clear(); _property.m_subProperty.clear();
_property.reset(); _property.reset();
}
}
prop.setPositionStart(tmpCurrentPos); prop.setPositionStart(tmpCurrentPos);
}
} else {
prop.setPositionStart(tmpCurrentPos);
}
while (iii < m_subNode.size()) { while (iii < m_subNode.size()) {
TK_REG_EXP_DBG_MODE2(" " << levelSpace(Node<CLASS_TYPE>::m_nodeLevel) << " (elem=" << iii << "/" << m_subNode.size() << ") data='" << autoStr(std::string(_data, tmpCurrentPos, _lenMax-tmpCurrentPos)) << "'"); TK_REG_EXP_DBG_MODE2(" " << levelSpace(Node<CLASS_TYPE>::m_nodeLevel) << " (elem=" << iii << "/" << m_subNode.size() << ") data='" << autoStr(std::string(_data, tmpCurrentPos, _lenMax-tmpCurrentPos)) << "'");
m_subNode[iii]->parse(_data, tmpCurrentPos, _lenMax, prop); m_subNode[iii]->parse(_data, tmpCurrentPos, _lenMax, prop);
@ -1191,6 +1196,7 @@ template<class CLASS_TYPE> class NodePThese : public Node<CLASS_TYPE> {
bool haveSubPartial = false; bool haveSubPartial = false;
for (int64_t iii=_property.m_subProperty.size()-1; iii>=0; --iii) { for (int64_t iii=_property.m_subProperty.size()-1; iii>=0; --iii) {
if (_property.m_subProperty[iii].getStatus() == parseStatusPartial) { if (_property.m_subProperty[iii].getStatus() == parseStatusPartial) {
TK_REG_EXP_DBG_MODE(" " << levelSpace(Node<CLASS_TYPE>::m_nodeLevel) << " (...) Have partial");
haveSubPartial = true; haveSubPartial = true;
break; break;
} }
@ -1200,21 +1206,20 @@ template<class CLASS_TYPE> class NodePThese : public Node<CLASS_TYPE> {
_property.setStatus(parseStatusFull); _property.setStatus(parseStatusFull);
return; return;
} }
int64_t tmpCurrentPos = _currentPos;
FindProperty prop;
size_t iiiStartPos = 0;
if (haveSubPartial == true) { if (haveSubPartial == true) {
TK_CRITICAL(" TODO ...");
// TODO : Really hard element ==> the current node might register the previous tree before rejecting parse ...
/*
for (int64_t jjj=_property.m_subProperty.size()-1; jjj>=0; --jjj) { for (int64_t jjj=_property.m_subProperty.size()-1; jjj>=0; --jjj) {
if (_property.m_subProperty[jjj].getStatus() == parseStatusPartial) { if (_property.m_subProperty[jjj].getStatus() == parseStatusPartial) {
findPartialNode = true;
prop = _property.m_subProperty[jjj]; prop = _property.m_subProperty[jjj];
tmpCurrentPos = prop.getPositionStop(); tmpCurrentPos = prop.getPositionStop();
_property.m_subProperty.erase(_property.m_subProperty.begin()+jjj, _property.m_subProperty.end()); _property.m_subProperty.erase(_property.m_subProperty.begin()+jjj, _property.m_subProperty.end());
iii = jjj; iiiStartPos = prop.getSubIndex();
TK_REG_EXP_DBG_MODE(" " << levelSpace(Node<CLASS_TYPE>::m_nodeLevel) << " (...) Rewind to " << iiiStartPos);
break; break;
} }
} }
*/
} else { } else {
if ( _property.getPositionStop() < 0 if ( _property.getPositionStop() < 0
&& Node<CLASS_TYPE>::m_multipleMin == 0 && Node<CLASS_TYPE>::m_multipleMin == 0
@ -1224,17 +1229,15 @@ template<class CLASS_TYPE> class NodePThese : public Node<CLASS_TYPE> {
return; return;
} }
} }
prop.setPositionStart(tmpCurrentPos);
_property.setStatus(parseStatusFull); _property.setStatus(parseStatusFull);
bool tmpFind = true; bool tmpFind = true;
while ( _property.getMultiplicity() <= Node<CLASS_TYPE>::m_multipleMax while ( _property.getMultiplicity() <= Node<CLASS_TYPE>::m_multipleMax
&& tmpFind == true) { && tmpFind == true) {
tmpFind = false; tmpFind = false;
for (size_t iii=0; iii<m_subNode.size(); ++iii) { for (size_t iii=iiiStartPos; iii<m_subNode.size(); ++iii) {
TK_REG_EXP_DBG_MODE(" " << levelSpace(Node<CLASS_TYPE>::m_nodeLevel) << " (... " << iii << "/" << m_subNode.size() << ")"); TK_REG_EXP_DBG_MODE(" " << levelSpace(Node<CLASS_TYPE>::m_nodeLevel) << " (... " << iii << "/" << m_subNode.size() << ")");
FindProperty prop; m_subNode[iii]->parse(_data, tmpCurrentPos+findLen, _lenMax, prop);
prop.reset();
prop.setPositionStart(_currentPos);
m_subNode[iii]->parse(_data, _currentPos, _lenMax, prop);
//offset = prop.getFindLen(); //offset = prop.getFindLen();
if ( prop.getStatus() == parseStatusFull if ( prop.getStatus() == parseStatusFull
|| prop.getStatus() == parseStatusPartial) { || prop.getStatus() == parseStatusPartial) {
@ -1243,13 +1246,17 @@ template<class CLASS_TYPE> class NodePThese : public Node<CLASS_TYPE> {
prop.setSubIndex(iii); prop.setSubIndex(iii);
_property.m_subProperty.push_back(prop); _property.m_subProperty.push_back(prop);
tmpFind = true; tmpFind = true;
prop.reset();
prop.setPositionStart(tmpCurrentPos+findLen);
break; break;
} else { }
TK_REG_EXP_DBG_MODE(" " << levelSpace(Node<CLASS_TYPE>::m_nodeLevel) << " (... " << iii << "/" << m_subNode.size() << ") ---NONE---"); TK_REG_EXP_DBG_MODE(" " << levelSpace(Node<CLASS_TYPE>::m_nodeLevel) << " (... " << iii << "/" << m_subNode.size() << ") ---NONE---");
prop.reset();
prop.setPositionStart(tmpCurrentPos+findLen);
} }
} iiiStartPos = 0;
if (tmpFind == true) { if (tmpFind == true) {
_property.multiplicityIncrement(); _property.setMultiplicity(_property.m_subProperty.size());
TK_REG_EXP_DBG_MODE(" " << levelSpace(Node<CLASS_TYPE>::m_nodeLevel) << " (...) mult=" << _property.getMultiplicity() << " find " << findLen); TK_REG_EXP_DBG_MODE(" " << levelSpace(Node<CLASS_TYPE>::m_nodeLevel) << " (...) mult=" << _property.getMultiplicity() << " find " << findLen);
if (_property.getMultiplicity() >= Node<CLASS_TYPE>::m_multipleMin) { if (_property.getMultiplicity() >= Node<CLASS_TYPE>::m_multipleMin) {
_property.setStatus(parseStatusPartial); _property.setStatus(parseStatusPartial);
@ -1585,6 +1592,7 @@ template<class CLASS_TYPE> class RegExp {
for (int64_t iii=_startPos; iii<_endPos; iii++) { for (int64_t iii=_startPos; iii<_endPos; iii++) {
int64_t findLen=0; int64_t findLen=0;
int64_t maxlen = _endPos-iii; int64_t maxlen = _endPos-iii;
TK_REG_EXP_DBG_MODE("----------------------------------------------");
TK_REG_EXP_DBG_MODE("parse element : " << iii << " : '" << _SearchIn[iii] << "'"); TK_REG_EXP_DBG_MODE("parse element : " << iii << " : '" << _SearchIn[iii] << "'");
if (true == m_notBeginWithChar) { if (true == m_notBeginWithChar) {
if (iii>0) { if (iii>0) {
@ -1603,21 +1611,18 @@ template<class CLASS_TYPE> class RegExp {
} }
regexp::FindProperty prop; regexp::FindProperty prop;
prop.setPositionStart(iii); prop.setPositionStart(iii);
m_exprRootNode.parse(_SearchIn, iii, maxlen, prop); bool needOneMoreCycle = true;
while (needOneMoreCycle == true) {
needOneMoreCycle = false;
m_exprRootNode.parse(_SearchIn, iii, _endPos, prop);
if ( prop.getStatus() == regexp::parseStatusFull if ( prop.getStatus() == regexp::parseStatusFull
|| prop.getStatus() == regexp::parseStatusPartial ) { || prop.getStatus() == regexp::parseStatusPartial ) {
findLen = prop.getFindLen(); findLen = prop.getFindLen();
TK_DEBUG("main search find : " << findLen << " elements"); TK_DEBUG("main search find : " << findLen << " elements data=" << std::string(_SearchIn, prop.getPositionStart(), prop.getFindLen()));
if ( _escapeChar != 0
&& iii>0) {
if (_escapeChar == (char32_t)_SearchIn[iii-1]) {
//==> detected escape char ==> try find again ...
continue;
}
}
// Check end : // Check end :
if (true == m_notEndWithChar) { if (m_notEndWithChar == true) {
if (iii+findLen < _SearchIn.size() ) { TK_DEBUG("Check end is not a char: '" << (char)_SearchIn[iii+findLen] << "'");
if (_startPos+findLen < (int64_t)_SearchIn.size() ) {
char32_t tmpVal = _SearchIn[iii+findLen]; char32_t tmpVal = _SearchIn[iii+findLen];
if( ( tmpVal >= 'a' if( ( tmpVal >= 'a'
&& tmpVal <= 'z' ) && tmpVal <= 'z' )
@ -1627,19 +1632,23 @@ template<class CLASS_TYPE> class RegExp {
&& tmpVal <= '9' ) && tmpVal <= '9' )
|| ( tmpVal == '_' ) ) { || ( tmpVal == '_' ) ) {
// go on the next char ... // go on the next char ...
continue; TK_DEBUG("Need one more cycle ...");
needOneMoreCycle = true;
} }
} }
} }
if (needOneMoreCycle == false) {
m_areaFind.start = iii; m_areaFind.start = iii;
m_areaFind.stop = iii + findLen; m_areaFind.stop = iii + findLen;
//prop.display(_SearchIn);
return true; return true;
} }
} }
}
}
return false; return false;
}; };
bool processOneElement(const CLASS_TYPE& _SearchIn, bool processOneElement(const CLASS_TYPE& _SearchIn,
int64_t _startPos, int64_t _startPos,
int64_t _endPos, int64_t _endPos,
@ -1676,7 +1685,7 @@ template<class CLASS_TYPE> class RegExp {
bool needOneMoreCycle = true; bool needOneMoreCycle = true;
while (needOneMoreCycle == true) { while (needOneMoreCycle == true) {
needOneMoreCycle = false; needOneMoreCycle = false;
m_exprRootNode.parse(_SearchIn, _startPos, maxlen, prop); m_exprRootNode.parse(_SearchIn, _startPos, _endPos, prop);
if ( prop.getStatus() == regexp::parseStatusFull if ( prop.getStatus() == regexp::parseStatusFull
|| prop.getStatus() == regexp::parseStatusPartial ) { || prop.getStatus() == regexp::parseStatusPartial ) {
findLen = prop.getFindLen(); findLen = prop.getFindLen();

View File

@ -219,13 +219,16 @@ void testRegExp() {
//std::string data = "p//TODO:\ndse"; //std::string data = "p//TODO:\ndse";
//std::string data = "p// TODO:\ndse"; //std::string data = "p// TODO:\ndse";
//std::string data = "p// TODO :\ndse"; //std::string data = "p// TODO :\ndse";
std::string data = "p// TODO : sdfgsdfsd \ndse"; //std::string data = "p// TODO : sdfgsdfsd \ndse";
testRegExpSingle("//[ \\t]*TODO[ \\t]*:.*$", data); //testRegExpSingle("//[ \\t]*TODO[ \\t]*:.*$", data);
std::string data = "abc m_def ghi";
testRegExpSingle("\\@m_[A-Za-z_0-9]*\\@", data);
} }
int main(int argc, const char *argv[]) { int main(int argc, const char *argv[]) {
// the only one init for etk: // the only one init for etk:
etk::log::setLevel(etk::log::logLevelDebug); etk::log::setLevel(etk::log::logLevelVerbose);
etk::setArgZero(argv[0]); etk::setArgZero(argv[0]);
etk::initDefaultFolder("ewolApplNoName"); etk::initDefaultFolder("ewolApplNoName");